# No subject

Tue Jun 4 12:17:20 MDT 2013

```	grep EXPR, LIST

evaluates EXPR for each element for LIST, setting \$_ to the element in
LIST, and returns a new array consisting of those members of LIST for
which EXPR is true.

Think of the line

@list = grep ++\$temp{\$_} < 2, @list;

like this:

for each element in @list
set \$_ equal to that element
if \$temp{\$_} is less than 2
// that means we haven't encountered \$_ before
add that element to the return value

Note that this preserves the order of the list.

To put it another way, every time ' ++\$temp{\$_} < 2 ' returns true, \$_
will be added to the return array.  Now, ' ++\$temp{\$_} < 2 ' means first
increment the value of \$temp{\$_} by 1, then test if it is less than 2.  If
\$_ has not yet been seen, then '++\$temp{\$_}' will set \$temp{\$_} to 1 and
hence \$_ will be returned, otherwise it will be larger than 1 and \$_ will
be ignored.

Here is an example: @list = ( 'a', 'b', 'a', 'c', 'a', 'b' ) ;

\$_ = 'a', \$temp{'a'} is undef, ++\$temp{'a'} sets \$temp{'a'} to 1
1 < 2 is true, so 'a' is added to the return value

\$_ = 'b', \$temp{'b'} is undef, ++\$temp{'b'} sets \$temp{'b'} to 1
1 < 2 is true, so 'b' is added to the return value

\$_ = 'a', \$temp{'a'} equals 1, ++\$temp{'a'} sets \$temp{'a'} to 2
2 < 2 is false, so 'a' is ignored

\$_ = 'c', \$temp{'c'} is undef, ++\$temp{'c'} sets \$temp{'c'} to 1
1 < 2 is true, so 'c' is added to the return value

\$_ = 'a', \$temp{'a'} equals 2, ++\$temp{'a'} sets \$temp{'a'} to 3
3 < 2 is false, so 'a' is ignored

\$_ = 'b', \$temp{'b'} equals 1, ++\$temp{'b'} sets \$temp{'b'} to 2
2 < 2 is false, so 'b' is ignored

That's the last element in @lsit, so the return value which is now
assigned to @list is ('a', 'b', 'c') .

Hope this helps.

Rob

```