bollock has asked for the wisdom of the Perl Monks concerning the following question:

The following minimal test-case causes a syntax error:
map { "$_" => undef } ();
I've reread the manual concerning map, implicit variables and the => operator; can't find my missunderstanding.

Changing "$_" to $_ works. As does preceding "$_" with a ;
This is perl, v5.8.7 built for i386-linux-thread-multi.

Replies are listed 'Best First'.
Re: Is this a perl compiler bug?
by dave_the_m (Monsignor) on Aug 24, 2005 at 11:51 UTC
    In perl, braces can either be a code block or an anonymous hash contructor; sometimes perl has to guess which one you meant, and in this case, guesses wrong. To perl, it sees { "key" => value } which looks very hashish; adding semicolons, or ()s or anything really, makes it think its a codeblock instead.

    Dave.

Re: Is this a perl compiler bug?
by davidrw (Prior) on Aug 24, 2005 at 11:53 UTC
    You need to add a unary + in there to help perl figure out that you want the map BLOCK LIST syntax and not the map EXPR, LIST syntax. So,
    map { +"$_" => undef } ();
    This is the relevant section from the perldoc -f map docs:
      "{" 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
    
      Thanks.
      My problem was that I didn't even know that the form
        map EXPR, LIST
      existed at all :-)
Re: Is this a perl compiler bug?
by gellyfish (Monsignor) on Aug 24, 2005 at 11:55 UTC

    You'll also find that putting a + before the "$_" will fix it. I think you will find that in the failing cases the problem is that the parser is taking the { "$_" => undef } to be an anonymous hash rather than a code block. Whether or not this is a bug is really a matter of interpretation - I'd put it into the "Ambiguity in Perl Syntax" bucket myself.

    /J\