Re^6: Pointers and References
by bliako (Monsignor) on Nov 24, 2020 at 19:33 UTC
|
Thanks for pointing this out LanX
Perhaps that's the reason I return a (array)ref: I don't want to say list! Because when I think I grasped the distinction list vs array, something proves me wrong again. But hey when in Perl speak Perl (even if some/quite-a-few publications use the terms interchangebly). I would prefer anonymous, readonly (fixed-size) array of readonly (lest they be references) items.
But here is a quick question: you can't modify a list item in say a foreach loop foreach my $x (1,2,3){ $x = 42 } (Modification of a read-only value attempted) but in the parameter list to a sub you can: $_[0] = 12 (as jcb demonstrated earlier).
bw, bliako
| [reply] [d/l] [select] |
|
Lists in Perl are two things:
- a syntax, mostly comma separated (, is a list operator)
- a temporary stack to pass this sequence of scalars
Array is
- a @variable holding
- a data structure in memory
So @a = (1,2,3) means step by step
- array variable @a at LHS forces a list assignment
- the comma syntax denotes a list
- the list values are pushed to a stack
- the stack is assigned to the array and stored in memory in an AV
I hope it's clearer now.
If it's a consolation, Larry occasionally confused the terminology too, e.g. in wantarray :)
> (Modification of a read-only value attempted)
That's because 1,2,3 are literals which are read only. Use variables (sic) and you can change them in the loop. ;)
| [reply] [d/l] |
|
use strict;
use warnings;
my $x = 12;
foreach my $aa ($x,$x){ $aa = 13; }
print $x;
----------
13
How about "readonly, anonymous stack" instead of list? Iam joking, enough of the nomenclature | [reply] [d/l] |
|
|
|
|
| [reply] |
|
|
|
|
... you can't modify a list item in say a foreach loop ... but
in the parameter list to a sub you can: $_[0] = 12 ...
Further to LanX's reply:
And, of course, one cannot modify a literal value in an argument
list even though the list is passed as an array (of aliases).
In no case can one modify a literal value: 1 is, let us
fervently hope, always 1.
Win8 Strawberry 5.8.9.5 (32) Tue 11/24/2020 14:56:16
C:\@Work\Perl\monks
>perl -Mstrict -Mwarnings -l
sub f { return $_[0] = 42; }
my $x = 88;
print f($x);
print $x;
print f(99);
^Z
42
42
Modification of a read-only value attempted at - line 1.
Give a man a fish: <%-{-{-{-<
| [reply] [d/l] [select] |
|
| [reply] [d/l] |
|
| [reply] [d/l] |