in reply to Re^2: map()'s BLOCK and deviations from othogonality...
in thread map()'s BLOCK and deviations from othogonality...

This is even documented in perlref:
Because curly brackets (braces) are used for several other +things including BLOCKs, you may occasionally have to disambiguate + braces at the beginning of a statement by putting a "+" or a "retu +rn" in front so that Perl realizes the opening brace isn't startin +g a BLOCK. The economy and mnemonic value of using curlies is +deemed worth this occasional extra hassle. For example, if you wanted a function to make a new hash an +d return a reference to it, you have these options: sub hashem { { @_ } } # silently wrong sub hashem { +{ @_ } } # ok sub hashem { return { @_ } } # ok On the other hand, if you want the other meaning, you can d +o this: sub showem { { @_ } } # ambiguous (currently o +k, but may change) sub showem { {; @_ } } # ok sub showem { { return @_ } } # ok The leading "+{" and "{;" always serve to disambiguate the +expres- sion to mean either the HASH reference, or the BLOCK.

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Replies are listed 'Best First'.
Re^4: map()'s BLOCK and deviations from othogonality...
by blazar (Canon) on Feb 25, 2005 at 09:37 UTC
    This is even documented in perlref:
    You're right! (What else?!?)

    I'm also ashamed, since I had read that section sometimes... OTOH retrospectively I'm slightly surprised that at least a few experienced perl hackers from clpmisc didn't recognize it at a first glance either...

    Because curly brackets (braces) are used for several other things including BLOCKs, you may occasionally have to disambiguate braces at the beginning of a statement by putting a "+" or a "return" in front so that Perl realizes the opening brace isn't starting a BLOCK. The economy and mnemonic value of using curlies is deemed worth this occasional extra hassle.
    Hmmm, it seems that the docs concentrate on the somewhat opposite situation, i.e. that in which a hashref is mistaken for a block.
    The leading "+{" and "{;" always serve to disambiguate the expres- sion to mean either the HASH reference, or the BLOCK.
    I must say that while I find "+{" aesthetically appealing, I can't say the same of "{;". But of course that's just me...