[ABE.pm] 'for' statement Q

Walt Mankowski waltman at pobox.com
Fri Aug 15 10:29:57 PDT 2008


On Fri, Aug 15, 2008 at 01:19:09PM -0400, Faber J. Fedor wrote:
> Yes, a question about the 'for' statement.  Can you beleive I'm teaching
> a Perl class on Monday? :-)
> 
> I thought this was a typo
> 
>     for($c, $m, $y) { $_-= $k; }
> 
> where 'for' was written when the author (Dominus) meant to type 'foreach'.
> But it turns out to work just like a foreach, IOW, it iterates over the
> list and $_ is assigned $c then $m then $y.

That's because "foreach" and "for" are equivalent.  From perlsyn:

  The "foreach" keyword is actually a synonym for the "for" keyword,
  so you can use "foreach" for readability or "for" for brevity.  (Or
  because the Bourne shell is more familiar to you than csh, so
  writing "for" comes more naturally.)

> Why does that work?  My theory is this: 
> 
> First note that the $c,$m,$y are not the traditional three elements of a
> for() loop (initial expression, incrementor, test) because those are
> separated by semi-colons.  Here the $c, $m, $y are the initial
> expression.  
> 
> Now, if the initial expression is true, the block will be executed. That
> explains why the block is executed the first time ($_ <- $c).  But why
> is the block executed two more times? My guess is the initial expression
> is seen in a list context and the code block as a reference, i.e. a
> scalar, and the scalar is applied to each element in the list.
> 
> That would explain why  'print $_ for(0)' produces an output even though
> the initial expression is false, n'est pas?    

I think it's just that it's treating whatever's in the parens as a
list, and iterating over that list.

Walt


More information about the ABE-pm mailing list