http://www.perlmonks.org?node_id=279095


in reply to Order-Preserving and Unique: List Cleanup

As to the issue of poor performance due to psuedohash overhead, that just isn't a factor in my thinking. Because the lists of things to be processed by this code will seldom exceed, say, 20 or so, it simply doesn't seem worthwhile to get worked up over the performance aspect. Convenience and these other preferences I've listed weigh in far more for me.

If that's the case, then why not just use the (much simpler, and easier to read) solution from this reply to the orriginal thread...

my %seen =() ; @unique_array = grep { ! $seen{$_}++ } @non_unique_array ;

Or, to make a one liner like yours...

perl -e '@a = $ARGV[0]? @ARGV : (<STDIN>); chomp @a; print join "\n", + grep { ! $s{$_}++ } @a;' $*

Replies are listed 'Best First'.
Re: Order-Preserving and Unique: List Cleanup
by Intrepid (Deacon) on Jul 30, 2003 at 09:01 UTC
    If that's the case, then why not just use the (much simpler, and easier to read) solution from this reply to the orriginal thread...
    my %seen =() ;
    @unique_array = grep { ! $seen{$_}++ } @non_unique_array ;

    Oh my, that is nicer! Well, that's what's great about Perl Monks. I think I may not have understood the thread referred to: I thought there was some issue with this solution where it would fail in some case. If I misunderstood, thanks for setting it straight for me!

    Update (Wed Jul 30 2003 18:02 UTC):

    So the rendition of this code which can act like a *NIX filter as well as handle input as @ARGV, is (using -l to put a final NL on):

    *nixprompt$ perl -le ' my %seen = (); my @ayin = $ARGV[0]? @ARGV : (<STDIN>); chomp @ayin; print join "\n", grep { !$seen{$_}++ } @ayin;'

    Beautiful!