On Sep 22, Bakken, Luke said:

>$/ = ''; print for grep [ chomp, s/\n\s+/ /g, s/\z/\n\n/ ], <>;
>
>I've never seen grep used with [ ] brackets before - it works the same
>with { }:
>
>print for grep { chomp, s/\n\s+/ /g, s/\z/\n\n/ } <>;

Not really.  Here's an example:

  print grep [ rand(2) < 1 ], 1 .. 10;

vs.

  print grep { rand(2) < 1 } 1 .. 10;

The first code prints all ten numbers.  The second code prints roughly
half of them.  Why?  Because [...] constructs a reference to an anonymous
array, and any reference is true in a boolean context.  Therefore, the
code that makes up the single element in the array (rand(2) < 1) is
executed, and the reference is returned to grep() for true/false.  Since
all references are true, all numbers 1 through 10 pass through the filter.
We just have the benefit of executing that code on all 10 elements, and it
doesn't matter whether rand(2) is less than 1 or not.  In the SECOND code,
however, rand(2) < 1 IS the true/false test.  Basically, if you want to
write a "filter" that executes code on each element and returns the
element (possibly modified) regardless of what the return value of the
filter would be, you can do:

  grep [ ... ], LIST
  # or perhaps
  grep [ do {...} ], LIST
  # or
  grep { ...; 1; } LIST

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
<stu> what does y/// stand for?  <tenderpuss> why, yansliterate of course.
[  I'm looking for programming work.  If you like my work, let me know.  ]


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

Reply via email to