On Fri, 2002-04-26 at 14:11, Allison Randal wrote: > On Fri, Apr 26, 2002 at 08:49:23AM +1000, Damian Conway wrote:
> Hmmm... how about: > > for $results.get_next() { > print $_; > LAST { print "Done."; } > ELSE { print "No results."; } > } > > The "else" of a loop construct isn't really the same as the "else" of an > C<if>. You can't use an C<elsif> for one thing. And the condition for Why not? What would be wrong with: for @x { ... } elsif (stuff) { ... } else { ... } Of course it brings other less wholesome things to mind like "elsfor" and "elsloop" and "if ... elsfor" and "for ... elsif ... elsloop ... else", but why not? > reaching the "else" is different too, it isn't always a "false value", Yes it is. > sometimes it's "no values to iterate over" or "condition met before > first execution of loop". while(@x) { ... } / if (@x) { ... } while($x) { ... } / if ($x) { ... } These are different how? To my eye, the only difference is what happens at the end of the block. In fact, while ($x) { ... ; last; } is an if. > I can also think of some advantages to having the "else" within the > scope of the loop. You might want your object to return a "false" value > from .get_next() (one that C<for> will see as non-iterate-able) but that > still contains some interesting properties that can be used by the > "else". If the "else" followed the loop this value wouldn't be in scope. This is something I had not considered, but sounds very cool. sub alllines ($file) { my $fh; if ($fh = IO::File->new("<$file")) { return $fh->getlines; } else { return $! but false; } } while alllines("/etc/passwd") -> $_ { ... } else { die "/etc/passwd: $_"; } Yeah... I like it.