Yikes!  This is what I was talking about.  Amazing.

Let me take a crack at the first one -- should be entertaining for everyone
;)

From: Jeff 'japhy/Marillion' Pinyan
>
> Here's a one-liner:
>
>   perl -nle 'print if !$seen{$_}++'

The dash n (-n) puts the command 'print if !$seen{$_}++' in a while (<>) {
... } loop.  So we get:

while (<>) {
    print if !$seen{$_}++
}

$seen{$_}

Tries to lookup the line in the hash of lines we've already seen.

$seen{$_}++

This is a complete guess, I can't seem to find anything like this in the
'Programming Perl' book.
It seems that if you say:

$seen{$_} = 1;

it causes the key to be added to the hash with the value 1, which is true in
boolean context.
So, if the key (line) wasn't previously seen, line"

$seen{$_}

might return a 0 or "false" to indicate it wasn't found.  Then the line

$seen{$_}++

might take that 0/"false", increment it by one turning it to 1/"true"
causing the key/$_/"line" to be added with a value of 1/"true".  If the
$_/"line" were already seen, it would have been added initially with a value
1/"true"; the ++ in this situation would just increment the value to
2,3,4...n, all of which are "true" values.

!$seen{$_}

Might negate the 1/"true" return of looking up a key that previously existed
in the hash, causing the

print

statement to execute, which is just short for

print STDOUT $_;

So how close am I and where can I read about this?


>
> and here's another:
>
>   perl -pe '$_ x= !$seen{$_}++'  (attributed to some of Larry's genius)
>

This would bypass the need for the print statement, but I'm not sure how the
'$_ x= ' in the statement works.

> and another, for use in a program
>
>   $seen{$_} ||= print OUT while <IN>;
>
> Have fun. :)

This is tons of fun!  Dying to know the answer!

Thanks,
David


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to