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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.