Deparse "string"->[$expr] and ->{$expr} correctly
authorFather Chrysostomos <sprout@cpan.org>
Wed, 21 Dec 2011 20:55:56 +0000 (12:55 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 22 Dec 2011 21:31:22 +0000 (13:31 -0800)
This commit finishes the work done by b89b7257 and be6cf5cf0a by mak-
ing "string"->[...] and "string"->{...} in general deparse correctly
when "string" is not a valid identifier.

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

index d99080a..927afd5 100644 (file)
@@ -3186,13 +3186,15 @@ sub elem_or_slice_array_name
     } elsif (is_scope($array)) { # ${expr}[0]
        return "{" . $self->deparse($array, 0) . "}";
     } elsif ($array->name eq "gv") {
-       $array = $self->gv_name($self->gv_or_padgv($array));
-       if ($array !~ /::/) {
-           my $prefix = ($left eq '[' ? '@' : '%');
-           $array = $self->{curstash}.'::'.$array
-               if $self->lex_in_scope($prefix . $array);
+       ($array, my $quoted) =
+           $self->stash_variable_name(
+               $left eq '[' ? '@' : '%', $self->gv_or_padgv($array)
+           );
+       if (!$allow_arrow && $quoted) {
+           # This cannot happen.
+           die "Invalid variable name $array for slice";
        }
-       return $array;
+       return $quoted ? "$array->" : $array;
     } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
        return $self->deparse($array, 24);
     } else {
@@ -3250,7 +3252,8 @@ sub elem {
     }
     if (my $array_name=$self->elem_or_slice_array_name
            ($array, $left, $padname, 1)) {
-       return "\$" . $array_name . $left . $idx . $right;
+       return ($array_name =~ /->\z/ ? $array_name : "\$" . $array_name)
+             . $left . $idx . $right;
     } else {
        # $x[20][3]{hi} or expr->[20]
        my $arrow = is_subscriptable($array) ? "" : "->";
index 2baef66..780d8b3 100644 (file)
@@ -908,11 +908,27 @@ no strict 'vars';
 () = '####'->[0];
 () = '^A'->[0];
 () = "\ca"->[0];
+() = 'open'->[$_]; #aelem
+() = '####'->[$_];
+() = '^A'->[$_];
+() = "\ca"->[$_];
+() = 'open'->{0}; #helem
+() = '####'->{0};
+() = '^A'->{0};
+() = "\ca"->{0};
 >>>>
 () = $open[0];
 () = '####'->[0];
 () = '^A'->[0];
 () = $^A[0];
+() = $open[$_];
+() = '####'->[$_];
+() = '^A'->[$_];
+() = $^A[$_];
+() = $open{'0'};
+() = '####'->{'0'};
+() = '^A'->{'0'};
+() = $^A{'0'};
 ####
 # [perl #74740] -(f()) vs -f()
 $_ = -(f());