Tielman Koekemoer (TNE) <[EMAIL PROTECTED]> asked:
> I've just come back to your post above (30/05/05) and I've
> tried to get the internal workings of the code to agree with
> my brain. Please help!
>
> > perl -e'print sort grep !$seen{$_}++, <>' FILENAME
>
> Initially I thought you were creating a hashref(?) key with
> every line of input, if unique. But I cannot access the keys
> using the hashref
> (below) so there is something else at work here.
>
> for $key_v (keys %{$seen}) {
> print "$key_v\n";
> }
>
> This returns nothing when used with the above code in a
> script (code posted at request). Sorry in advance if I've
> made newbie mistake but please explain how !$seen{$_}++ knows
> what was used before.
He's using just a hash, namely %seen. What he's doing is
reading all the files on the command line (or standard input
if there are no filename arguments) in list context, i.e.
he turns them into a large list of lines. This list is then
"filtered" by the grep command. This will return a subset of
the argument list - namely those items for which the grep
expression is true. That expression is "!$seen{$_}++".
$_ will be on of the lines. The first time a unique line
is evaluated in this expression, $seen{$_} does not exist
and the value is undefined. The ! operator forces this into
a boolean false and returns boolean true, i.e. the line will
be part of the result set. the post-increment ++ operator
will then create a hash key with the line as key and assign
it (undef)+1 = 1 as a value. So when the line is encountered
again, it will evaluate to a positive number, which will be
negated to false by the ! operator, which in turn means that
the line will not be put into the result set twice.
> PS Will the Perl Cookbook have examples to common tools such as this?
> What does everyone think of the book - very helpful?
It has lots of useful code snippets, and they are commented
well enough to follow with a basic grasp of Perl. I would
not want to miss it in my library. It also used to be part
of a Book/CD set called the Perl Bookshelf. AFAIK it's out
of print but you might be able to pick it up at a used book
store (or onlinle at ABEbooks) cheaply.
Alternatively, if you want to learn about Perl style, check
out Joseph N. Hall's Effective Perl Programming.
HTH,
Thomas
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>