I'm surprised no one has mentioned order yet. If you want unique values but you also want to preserve the order of the values, a simple hash isn't going to work. I would store the items into both structures, personally. Maybe not the most efficient way to do it, but set the value in the hash (keeping count if you like, as mentioned previously) and pushing onto an array if the hashed item didn't already exist. Something like:
#!/usr/bin/perl
use strict;
use warnings;
my (%found, @ordered_uniques);
while (my $line = <DATA>) {
chomp $line;
next if $line !~ /\w/; # Skip non-word lines
if (not exists $found{$line}) {
push @ordered_uniques, $line;
}
$found{$line}++;
}
print "Ordered unique values:\n";
print (join ", ", @ordered_uniques);
print "\n\nUnordered unique values:\n";
print (join ", ", keys %found);
__DATA__
one
foo
bar
one
baz
two
quack
baz
which outputs the expected:
Ordered unique values:
one, foo, bar, baz, two, quack
Unordered unique values:
bar, baz, one, quack, foo, two
So "best practice" depends on your application.