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


in reply to To Hash or to Array--Uniqueness is the question.

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.