This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #117531] Deparse elements of %# correctly
authorFather Chrysostomos <sprout@cpan.org>
Tue, 4 Jun 2013 04:57:33 +0000 (21:57 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 4 Jun 2013 05:36:37 +0000 (22:36 -0700)
They can only be referred to as $# {foo} and ${#}{foo}, not as $#{foo},
as that means $#foo.

dist/B-Deparse/Deparse.pm
dist/B-Deparse/t/deparse.t

index b62976d..bbb2453 100644 (file)
@@ -3515,7 +3515,9 @@ sub elem {
     }
     if (my $array_name=$self->elem_or_slice_array_name
            ($array, $left, $padname, 1)) {
-       return ($array_name =~ /->\z/ ? $array_name : "\$" . $array_name)
+       return ($array_name =~ /->\z/
+                   ? $array_name
+                   : $array_name eq '#' ? '${#}' : "\$" . $array_name)
              . $left . $idx . $right;
     } else {
        # $x[20][3]{hi} or expr->[20]
index 01bb74b..5087485 100644 (file)
@@ -1410,3 +1410,6 @@ use feature 'state', 'lexical_subs';
 no warnings 'experimental::lexical_subs';
 state sub f {}
 print f();
+####
+# Elements of %# should not be confused with $#{ array }
+() = ${#}{'foo'};