diff options
author | Nicholas Clark <nick@ccl4.org> | 2000-11-17 22:10:28 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2000-11-18 00:18:39 +0000 |
commit | 205fdb4dcc2a09a94a9a700fc43fd510076b1d5a (patch) | |
tree | 7a2cf2ec0caa8333492bee32d4681c017e3b985c /pod | |
parent | f23f9bed5ff5d433337f9e7e04a6840dc1f93e78 (diff) | |
download | perl-205fdb4dcc2a09a94a9a700fc43fd510076b1d5a.tar.gz |
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
Diffstat (limited to 'pod')
-rw-r--r-- | pod/perlfunc.pod | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index 2049dd57a2..ec0fe0880f 100644 --- a/pod/perlfunc.pod +++ b/pod/perlfunc.pod @@ -2483,6 +2483,29 @@ Using a regular C<foreach> loop for this purpose would be clearer in most cases. See also L</grep> 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<map { ...> 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 |