in reply to What does 'next if $hash{$elem}++;' mean?

next if $seen{ $elem }++;

"Skip to the next iteration of the loop if $seen{ $elem } is true, otherwise make $seen{ $elem } true and continue."

Check out the segment on the unary '++' operator in perlop. When the operator follows a variable, it is incremented after its evaluation. In other words, in the above code, if checks the value of $seen{ $elem } before incrementing it. Since the action "next" is taken before the increment happens, the increment is skipped. Here's longer (and probably slightly slower) equivalent code:

if ( $seen{ $elem } ) { next; # skip to the next loop iteration } else { $seen{ $elem } += 1; }

This is a common pattern that checks if you've encountered $elem before. If you have, it will not process it a second time; otherwise, it will mark $elem so that you won't process it again.

This could be used to get all the unique lines from a file, for example.

use strict; use warnings; open my $IN, '<', $ARGV[0] or die("Can't read $ARGV[0]: $!"); open my $OUT, '<', $ARGV[1] or die("Can't write $ARGV[1]: $!"); my %seen; while (<$IN>) { next if $seen{$_}++; # check/mark line as seen print $OUT $_; } close $IN; close $OUT;

Or, even shorter while loop:

while (<$IN>) { $seen{$_}++ || print $OUT $_ }
<-radiant.matrix->
A collection of thoughts and links from the minds of geeks
The Code that can be seen is not the true Code
I haven't found a problem yet that can't be solved by a well-placed trebuchet