Here's my interpretation :
%saw is a hash.
$saw{$_} is the value in this hash associated with the key $_
$saw{$_}++ increases this value by 1
!$saw{$_} is a logical which means "there is no value associated with the key $_ in %saw" .
Now, this is used inside a grep applied to @in : this means that $_ will take each of the value in @in . Let's take the first value of @in : obviously it's not yet in %saw so the conditional !$saw{$_} is TRUE (it's a double negation) . Therefore grep validates and this first value goes into @out.
At this time a little magic happens : after evaluation of !$saw{$_} the ++ is applied . I'm only guessing this happens because of some precedence of ! over ++ .
So what if the second element of @in is the same as the first ? Well, since ++ happened , $saw{$_} will have a value of 1 and therefore !$saw{$_} will be FALSE : you will not get this repetition in the final @out .
Hope this helps,
ZlR .
Question : I just checked in the camel book:
the ! opertor has an arity of 1 and is right associative
the ++ operator also has an arity of 1 but is not associative.
I'm not sure then why the !$saw{$_}++ is correctly evaluated since they have the same arity.
Answer by ysth : nothing to do with arity , it's just that ! has higher precedence than ++ .
In reply to Re: What does !$saw{$_}++ means
by ZlR
in thread What does !$saw{$_}++ means
by nwkcmk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |