http://qs321.pair.com?node_id=205192


in reply to Get All Duplicated Elements in an Array (Once, without shifting)

You could refine that to have an out list rather than an out hash. Every value you store in it has the value 1!

my %multiples; my @out; for (@in) { if ($multiples{$_} == 1) { push @out, $_; } $multiples{$_} = 1; } print "@out";
Now since it contains only one statement, you could write the if in suffix form. You could use ++ instead of setting the count to 1 in the unconditional statement.

That gets down to:

my %multiples; my @out; for (@in) { push @out, $_ if ($multiples{$_}++ == 1) } print "@out";
That's tight enough that you can see how merlyn's form works. Just use the built-in looping mechanism of grep instead of your own foreach loop/push. It's the same thing.

He used pre-increment == 2, which you'll note is the same thing as post-increment == 1. The latter is more directly equivilent to what you had originally, but the pre-increment is arguably more efficient (though I don't know if measurably faster in Perl).