http://qs1969.pair.com?node_id=411217


in reply to Mysterious "syntax error"

Because map can take either a block or an expression, and open curly can start a block or an expression (start of an anonymous hash), there's some "guessing" code to deal with the ambiguity, and sometimes it guesses wrong.

You can disambiguate these with:

map {; ... definitely a block ... } ... map +{ ... definitely an anonhash ... }, ...
This is documented in perldata I believe. Or perlref.

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

Replies are listed 'Best First'.
Re^2: Mysterious "syntax error"
by BrowserUk (Patriarch) on Nov 30, 2004 at 16:07 UTC

    D'uh! I should've worked that out, but ... I didn't.

    I've encountered it before. I may even have asked a SoPW on it a ways back. I'm pretty sure I've answered one or two about it, but I could *not* see the ambiguity. I guess that just shows how infrequently the guessing gets it wrong.

    Thanks.


    Examine what is said, not who speaks.
    "But you should never overestimate the ingenuity of the sceptics to come up with a counter-argument." -Myles Allen
    "Think for yourself!" - Abigail        "Time is a poor substitute for thought"--theorbtwo         "Efficiency is intelligent laziness." -David Dunham
    "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon
Re^2: Mysterious "syntax error"
by dragonchild (Archbishop) on Nov 30, 2004 at 18:12 UTC
    That doesn't answer the question as to why the two examples BrowserUk listed in his second <code> block work. Those should both be ambiguous, as well, at least to my mind. Would you mind taking a stab at explaining how perl figures those out?

    Being right, does not endow the right to be rude; politeness costs nothing.
    Being unknowing, is not the same as being stupid.
    Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
    Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

      If you wanna take a look at the logic of the guess, take a look in toke.c and search for OP_MAPSTART. It's at line 4000 in the 5..8.5 source.

      (I think) The logic for making the guess starts at the comment /* Is this a word before a => operator? */ a few lines below and extends for 100 lines or so. The comments, (if not the code :), make interesting reading as to just how complex this is.


      Examine what is said, not who speaks.
      "But you should never overestimate the ingenuity of the sceptics to come up with a counter-argument." -Myles Allen
      "Think for yourself!" - Abigail        "Time is a poor substitute for thought"--theorbtwo         "Efficiency is intelligent laziness." -David Dunham
      "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon

        That appears to be deciding how to interpret a bareword, not a '{'. I quickly looked but didn't find the code for guessing at the meaning of a '{', though.

        Actually, I'd like to see merlyn download the source from one of those 150 locations and show us how easy it is to find and interpret this code. (:

        - tye        

      Those should both be ambiguous, as well, at least to my mind
      What part of
      there's some "guessing" code to deal with the ambiguity
      did you miss reading? if you mean "what is the actual rules of the guessing?", well the Perl source code is available for download in about 150 CPAN locations, at least.

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