From 205fdb4dcc2a09a94a9a700fc43fd510076b1d5a Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Fri, 17 Nov 2000 22:10:28 +0000 Subject: [PATCH] Explain in more detail the {} syntax ambiguousity. Subject: [PATCH] Re: [ID 20001117.003] map { "$_", 1} @array is syntax error Message-ID: <20001117221028.A88930@plum.flirble.org> p4raw-id: //depot/perl@7731 --- pod/perlfunc.pod | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index 2049dd5..ec0fe08 100644 --- a/pod/perlfunc.pod +++ b/pod/perlfunc.pod @@ -2483,6 +2483,29 @@ Using a regular C loop for this purpose would be clearer in most cases. See also L for an array composed of those items of the original list for which the BLOCK or EXPR evaluates to true. +C<{> starts both hash references and blocks, so C could be either +the start of map BLOCK LIST or map EXPR, LIST. Because perl doesn't look +ahead for the closing C<}> it has to take a guess at which its dealing with +based what it finds just after the C<{>. Usually it gets it right, but if it +doesn't it won't realize something is wrong until it gets to the C<}> and +encounters the missing (or unexpected) comma. The syntax error will be +reported close to the C<}> but you'll need to change something near the C<{> +such as using a unary C<+> 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 C<+{> + + @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end + +and you get list of anonymous hashes each with only 1 entry. + =item mkdir FILENAME,MASK =item mkdir FILENAME -- 2.7.4