This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Deparse list repetition assignment properly
authorFather Chrysostomos <sprout@cpan.org>
Sat, 25 Oct 2014 21:41:52 +0000 (14:41 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 26 Oct 2014 00:41:17 +0000 (17:41 -0700)
This only applies to the almost useless case of nothing but a repetition
on the lhs of list assignment:  ((undef)x3) = foo();

Other cases where the repetition is part of a larger list already
deparsed correctly.

Checking whether the lhs begins with a parenthesis is not sufficient
to determine whether the lhs is parenthesized.  I believe repetition
is the only binary op other than the comma that is allowed on the
lhs, so we can just check for that in the op tree.

lib/B/Deparse.pm
lib/B/Deparse.t

index ea82ebd..ade6a78 100644 (file)
@@ -2542,9 +2542,17 @@ sub binop {
     if ($flags & SWAP_CHILDREN) {
        ($left, $right) = ($right, $left);
     }
+    my $leftop = $left;
     $left = $self->deparse_binop_left($op, $left, $prec);
     $left = "($left)" if $flags & LIST_CONTEXT
-               && $left !~ /^(my|our|local|)[\@\(]/;
+                    and    $left !~ /^(my|our|local|)[\@\(]/
+                        || do {
+                               # Parenthesize if the left argument is a
+                               # lone repeat op.
+                               my $left = $leftop->first->sibling;
+                               $left->name eq 'repeat'
+                                   && null($left->sibling);
+                           };
     $right = $self->deparse_binop_right($op, $right, $prec);
     return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
 }
index 98a19c8..a206529 100644 (file)
@@ -358,6 +358,9 @@ $test /= 2 if ++$test;
 # list x
 -((1, 2) x 2);
 ####
+# Assignment to list x
+((undef) x 3) = undef;
+####
 # lvalue sub
 {
     my $test = sub : lvalue {