sub unique_elements { my ( %unique ); # @_ could be large, so I don't want to put the list in memory, or even put a list of indices into mem like you do with 0 .. $#_ for ( my $i = 0; $i < @_; $i++ ) { # but the inner lists are a small fixed size, so even though the sollution is generalized, the inner values I do just stick in a list, which I use for a hash slice to autovivify the keys @unique{@{$_[$i]}} = undef; # black magic warning! the first element in the slice is assigned undef, and the rest are autovivfied } return sort keys %unique; }