Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: A list assignment gotcha (updated)

by AnomalousMonk (Archbishop)
on Jul 30, 2020 at 03:38 UTC ( [id://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 (Parson) 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.

      PDL is all about the "array programming", where you do an operation to the whole ndarray, and PDL just does that thing to everything in it. So for an ndarray, $pdl += 1 really would add 1 to all the elements in it.

      This is an example of the array-programming concept known these days as "broadcasting", which PDL used to slightly-confusingly call "threading".

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (3)
As of 2024-04-20 04:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found