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


in reply to Uniq and sort in perl

Any time you need to get a unique list in Perl you should think of using a hash. Say you defined a hash called %seen outside the while loop and changed the print line to read...
print "$vm, $filer, \n" if ! $seen{"$vm:$filler"}++;
This will print the entry the first time and increment the seen flag for that pair, now subsequent identical results will encounter a set flag and not print as a result

print "Good ",qw(night morning afternoon evening)[(localtime)[2]/6]," fellow monks."

Replies are listed 'Best First'.
Re^2: Uniq and sort in perl
by slayedbylucifer (Scribe) on Jul 12, 2012 at 09:22 UTC

    Utilitarian, I can't thank you enough. Your solution is **exactly** what I was looking for. Thank you very Much !!

    But, unfortunately i am not able to decode or understand your oneliner. Could you guide me to some documentation for the same.

    Thanks Again for the lightning fast response.

      What is happening in that one liner:
      print "$vm, $filer, \n" if ! $seen{"$vm:$filler"}++
      It's quite an elegant piece of code, with a lot going on. So let's break it down:
      • The hash called '%seen' is being checked - to see if it contains a key called "$vm:$filler". The value of this is being tested for being 'false'. (because there's 'if !' which is 'if not') - which is literally 'if not seen'
      • So if $seen{"$vm:filler"} is _not_ 'true' - we haven't seen it, and so we print it.
      • And then that ++ kicks in, to post increment, 'adding one' to $seen{"$vm:$filler"}' - so the first time we try doing that, it's going to be undefined (and thus false) triggering a print. Second time, it'll be 'non zero' and so evaluate as 'true'.
      For bonus points, you can probably do:
      foreach my $key ( keys %seen ) { print "$key was seen $seen{$key} times\n"; }
      Does that make it any clearer?