[Edinburgh-pm] syntax error weirdness

asmith9983@gmail.com asmith9983 at gmail.com
Fri Aug 5 13:10:30 PDT 2005


Hi
The answer to the third line problem is easily solved, and is along the lines 
of the replies already given.  Add a semi-colon after the opening curly to 
help
  perl understand its a block and not a hash.

i.e.

perl -e 'map {; "$_",1 } "x"'

That explanation is courtesy of my son Ben, a Perl expert

-- 
Andrew

On Fri, 5 Aug 2005, Jonathan Barber wrote:

> On Fri, Aug 05, 2005 at 12:58:01AM +0100, David Baird wrote:
>> dave at evesham$ perl -e 'map { $_,1 } "x"'
>> dave at evesham$ perl -e 'map { "$_" } "x"'
>> dave at evesham$ perl -e 'map { "$_",1 } "x"'
>> syntax error at -e line 1, near "} "x""
>> Execution of -e aborted due to compilation errors.
>> dave at evesham$ perl -v
>>
>> This is perl, v5.8.6 built for i386-freebsd-64int
>>
>> Anybody know why the third line shouldn't compile? Just seems weird.
>
> I think it's down to perl trying to guess whether the curly braces are a
> block, expression or a hash ref. From the map fucntion's perldoc
> (perldoc -f map):
>
> === begin quote ===
>
> "{" 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
>
> === end quote ===
>
> This is what you're running into. Perl thinks your third expression is a
> hash ref, and so you get a syntax error, because map expects a BLOCK or
> EXPR as it's first argument.
>
>> d.
>


More information about the Edinburgh-pm mailing list