Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: A list assignment gotcha (updated)

by AnomalousMonk (Bishop)
on Jul 30, 2020 at 03:38 UTC ( #11120049=note: print w/replies, xml ) Need Help??


in reply to A list assignment gotcha
in thread Not understanding 2 sentences in perldoc

That's because the (scalar) operator of an op= imposes scalar context on the lists and so only the last element of each list is affected:

c:\@Work\Perl\monks>perl -wMstrict -le "my ($x, $y, $z) = (30, 40, 50); ($x, $y, $z) += (3, 4, 5); print qq{$x, $y, $z}; " Useless use of a constant in void context at -e line 1. Useless use of a constant in void context at -e line 1. Useless use of private variable in void context at -e line 1. Useless use of private variable in void context at -e line 1. 30, 40, 55
Raku can do these kinds of list operations; see Raku Programming/Meta Operators.

Update: I'm not aware that you can do this with pure lists in Perl 5, but it can certainly be done with arrays:

c:\@Work\Perl\monks>perl -wMstrict -le "my @ra = (30, 40, 50); my @rb = ( 3, 4, 5); ;; $ra[$_] += $rb[$_] for 0 .. $#ra; print qq{@ra}; " 33 44 55
And via List::MoreUtils::pairwise():
c:\@Work\Perl\monks>perl -wMstrict -le "use List::MoreUtils qw(pairwise); use vars qw($a $b); ;; my @ra = (30, 40, 50); my @rb = ( 3, 4, 5); ;; my @rc = pairwise { $a + $b } @ra, @rb; print qq{@rc}; " 33 44 55
or
c:\@Work\Perl\monks>perl -wMstrict -le "use List::MoreUtils qw(pairwise); use vars qw($a $b); ;; my @ra = (30, 40, 50); my @rb = ( 3, 4, 5); ;; pairwise { $a += $b } @ra, @rb; print qq{@ra}; " 33 44 55
(The  use vars qw($a $b); statement quiets some warnings.)


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: A list assignment gotcha (updated)
by jcb (Vicar) on Jul 31, 2020 at 01:26 UTC

    Exactly — they look analogous, but they are not. The List::MoreUtils tricks are interesting, but actually wrap a loop iterating over arrays instead of being a true "vectorized" modifying assignment. There is probably something in PDL for this if your program does that kind of processing, but for a simple case with a list of Perl scalars, you need to use multiple statements.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11120049]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2020-09-30 10:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If at first I donít succeed, I Ö










    Results (160 votes). Check out past polls.

    Notices?