summaryrefslogtreecommitdiff
path: root/pod
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2000-11-17 22:10:28 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2000-11-18 00:18:39 +0000
commit205fdb4dcc2a09a94a9a700fc43fd510076b1d5a (patch)
tree7a2cf2ec0caa8333492bee32d4681c017e3b985c /pod
parentf23f9bed5ff5d433337f9e7e04a6840dc1f93e78 (diff)
downloadperl-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.pod23
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