summaryrefslogtreecommitdiff
path: root/pod
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-08-01 20:36:10 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-08-01 20:38:19 -0700
commitc74de2fbdcadd54cfd75e22394d106513fa1bace (patch)
treec25c8ced4327d8b1bffd2fd8399805b8ca0119fe /pod
parent2ad09a1fe3da562638906ebab32a55108ba9c364 (diff)
downloadperl-c74de2fbdcadd54cfd75e22394d106513fa1bace.tar.gz
Update perlsyn for given aliasing $_
plus one typo fix
Diffstat (limited to 'pod')
-rw-r--r--pod/perlsyn.pod34
1 files changed, 18 insertions, 16 deletions
diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod
index 3bebeec7ad..fe473f6e58 100644
--- a/pod/perlsyn.pod
+++ b/pod/perlsyn.pod
@@ -638,24 +638,25 @@ and C<given> assigns the C<$_> variable its topic value.
Exactly what the I<EXPR> argument to C<when> does is hard to describe
precisely, but in general, it tries to guess what you want done. Sometimes
-it is interpreted as C<< $_ ~~ I<EXPR> >>, and sometimes it does not. It
+it is interpreted as C<< $_ ~~ I<EXPR> >>, and sometimes it is not. It
also behaves differently when lexically enclosed by a C<given> block than
it does when dynamically enclosed by a C<foreach> loop. The rules are far
too difficult to understand to be described here. See L</"Experimental Details
on given and when"> later on.
Due to an unfortunate bug in how C<given> was implemented between Perl 5.10
-and 5.14, under those implementations the version of C<$_> governed by
+and 5.16, under those implementations the version of C<$_> governed by
C<given> is merely a lexically scoped copy of the original, not a
dynamically scoped alias to the original, as it would be if it were a
C<foreach> or under both the original and the current Perl 6 language
-specification. This bug is expected to be addressed in a future release of
-Perl. For forwards compatibility, if you really want a lexical C<$_>,
+specification. This bug was fixed in Perl
+5.18. If you really want a lexical C<$_>,
specify that explicitly:
given(my $_ = EXPR) { ... }
-In the meanwhile, stick to C<foreach> for your topicalizer and
+If your code still needs to run on older versions,
+stick to C<foreach> for your topicalizer and
you will be less unhappy.
=head2 Goto
@@ -883,9 +884,10 @@ shell:
As previously mentioned, the "switch" feature is considered highly
experimental; it is subject to change with little notice. In particular,
-both C<given> and C<when> have tricky behaviours that are expected to
-change to become less tricky in the future. Do not rely upon their
-current (mis)implementations.
+C<when> has tricky behaviours that are expected to change to become less
+tricky in the future. Do not rely upon its current (mis)implementation.
+Before Perl 5.18, C<given> also had tricky behaviours that you should still
+beware of if your code must run on older versions of Perl.
Here is a longer example of C<given>:
@@ -912,18 +914,18 @@ Here is a longer example of C<given>:
}
}
-As currently implemented, C<given(EXPR)> assign the value of I<EXPR> to
+Before Perl 5.18, C<given(EXPR)> assigned the value of I<EXPR> to
merely a lexically scoped I<B<copy>> (!) of C<$_>, not a dynamically
-scoped alias the way C<foreach> does. That makes it similar to
+scoped alias the way C<foreach> does. That made it similar to
do { my $_ = EXPR; ... }
-except that the block is automatically broken out of by a
-successful C<when> or an explicit C<break>. Because it is only a
-copy, and because it is only lexically scoped, not dynamically
-scoped, you cannot do the things with it that you are used to in
-a C<foreach> loop. In particular, you probably cannot use
-arbitrary function calls. Best stick to C<foreach> for that.
+except that the block was automatically broken out of by a successful
+C<when> or an explicit C<break>. Because it was only a copy, and because
+it was only lexically scoped, not dynamically scoped, you could not do the
+things with it that you are used to in a C<foreach> loop. In particular,
+it did not work for arbitrary function calls if those functions might try
+to access $_. Best stick to C<foreach> for that.
Most of the power comes from the implicit smartmatching that can
sometimes apply. Most of the time, C<when(EXPR)> is treated as an