From: Kripa Sundar <[EMAIL PROTECTED]>
   Date: Mon, 23 Aug 2004 16:15:07 -0400

   Hello all,

   I am clearly overlooking something basic, but I can't wrap my
   head around the parse error in the second command below.
   It is apparently caused when the the only contents of a map()
   BLOCK is a list without parens.

     || % perl -le 'print map {1; 1, 2} qw(a b)'
     || 1212
     || % 
     || % perl -le 'print map {1, 2} qw(a b)'
     || syntax error at -e line 1, near "} qw(a b)"
     || Execution of -e aborted due to compilation errors.
     || % 
     || % perl -le 'print map {(1, 2)} qw(a b)'
     || 1212
     || % 
     || % perl -v | grep built
     || This is perl, v5.6.0 built for sun4-solaris
     || %

But this also works:

        [EMAIL PROTECTED]> perl -le 'print map {+1, 2} qw(a b)'
        1212
        [EMAIL PROTECTED]> perl -v | fgrep built
        This is perl, v5.8.1 built for i586-linux-thread-multi
        [EMAIL PROTECTED]> 

As this doc excerpt (from "map" on "perlfunc") says it should:

               "{" 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.

<rant> Personally, I find this sort of "magic syntax" crap really
annoying.  Being an old Lisp hacker, I would have preferred that map
always take a functional; then there's no syntax guesswork.  But, being
an old Lisp hacker, I also realize that I'm just a lone voice crying in
the wilderness . . . </rant>

                                        -- Bob Rogers
                                           http://rgrjr.dyndns.org/
_______________________________________________
Boston-pm mailing list
[EMAIL PROTECTED]
http://mail.pm.org/mailman/listinfo/boston-pm

Reply via email to