Documented behaviour. From perlfunc, the entry for map:
"{" starts both hash references and blocks, so
"map { ..." could be either the start of map BLOCK
LIST or map EXPR, LIST. Because perl doesn't look
ahead for the closing "}" it has to take a guess
at which its dealing with based what it finds just
after the "{". Usually it gets it right, but if it
doesn't it won't realize something is wrong until
it gets to the "}" and encounters the missing (or
unexpected) comma. The syntax error will be
reported close to the "}" but you'll need to
change something near the "{" such as using a
unary "+" to give perl some help:
%hash = map { "\L$_", 1 } @array # perl guesses EXPR. wrong
%hash = map { +"\L$_", 1 } @array # perl guesses BLOCK. right
%hash = map { ("\L$_", 1) } @array # this also works
%hash = map { lc($_), 1 } @array # as does this.
%hash = map +( lc($_), 1 ), @array # this is EXPR and works!
%hash = map ( lc($_), 1 ), @array # evaluates to (1, @array)
or to force an anon hash constructor use "+{"
@hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
and you get list of anonymous hashes each with
only 1 entry.
amd from perltrap:
o Parsing
When perl sees "map {" (or "grep {"), it has to guess
whether the "{" starts a BLOCK or a hash reference. If
it guesses wrong, it will report a syntax error near
the "}" and the missing (or unexpected) comma.
Use unary "+" before "{" on a hash reference, and
unary "+" applied to the first thing in a BLOCK (after
"{"), for perl to guess right all the time. (See "map"
in perlfunc.)
Abigail | [reply] [d/l] |
| [reply] [d/l] |