Paul wrote: > --- Rob Dixon <[EMAIL PROTECTED]> wrote: > > Paul wrote: > > > > do { > > > > my $empty; > > > > $empty ++; > > > > }; > > > > > > Also, the do() is superfluous here, isn't it? > > > > I was trying to show something that would return a value in > > the same way as a subroutine block (so that I didn't need a > > return statement in the same way as a subroutine doesn't). > > I started out with a bare block, but realised that it needed > > a 'do' to have a value, and therefore make it non-redundant > > in context. > > Got it. > > my $x = { code, more code.... } > > doesn't work, because the braces are expecting to be an anonymous hash > in that context, so they aren't a block. > > my $x = do { code }; > > works, because do flips the context, expecting a block and returning a > value.
I hadn't actually thought of it that way, but it's remarkably well explained. Well done. > That way I can say > > my $fh = do { local $_ }; > open $fh, $file or die $!; > > for a cheap, quick, anonymous filehandle in a scalar. :) > (note to the peanut gallery: henceforward I digress!) Ah, now that's not quite right. The 'do' block will create a local copy of $_, initialised to 'undef'. The end of the block returns 'undef' as it is the last executed line, and $_ will be restored from its saved value. The line is therefore the same as: my $fh = undef; or just my $fh; and the entire code works as: open my $fh, $file or die $!; > I've definitely used that trick...but all in all, for that > *particular* usage I recommend > > use FileHandle; > my $fh = new FileHandle $file or die $!; > > which is much more readable to the uninitiated, and still only two > lines of code. ;o] If we're counting lines, I think mine wins! Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]