Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^6: Pointers and References

by bliako (Prior)
on Nov 24, 2020 at 19:33 UTC ( #11124154=note: print w/replies, xml ) Need Help??


in reply to Re^5: Pointers and References
in thread Pointers and References

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

Replies are listed 'Best First'.
Re^7: Pointers and References
by LanX (Cardinal) on Nov 24, 2020 at 19:52 UTC
    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. ;)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      yep

      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

        And also for arrays:

        Win8 Strawberry 5.8.9.5 (32) Tue 11/24/2020 17:09:57 C:\@Work\Perl\monks >perl -Mstrict -Mwarnings -l my $x = 1; my $y = 2; my @z = (3, 4, 5); $_ += 100 for @z, $x, $y; print "$x, $y, (@z)"; for ($x, @z, $y) { $_ += 100; } print "$x, $y, (@z)"; ^Z 101, 102, (103 104 105) 201, 202, (203 204 205)


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

        I hope the distinction between list and arrays is clearer now, I know its confusing.

        E.g. this is a list assignment without literal list: @a = %a ,

        ... the hash is unpacked into a list which is packed into an array.

        or here you need a literal list to init an array(-ref) : $a_ref = [ 1,2,3 ]

        Please feel free to ask. :)

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

      That's because 1,2,3 are literals which are read only. Use variables (sic) and you can change them in the loop. ;)

      It took me a few times to understand this line based on the examples given further below but now this makes sense!

Re^7: Pointers and References
by AnomalousMonk (Bishop) on Nov 24, 2020 at 20:13 UTC
    ... 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:  <%-{-{-{-<

      Thank you for providing your examples demonstrating how variables, but not literals, can be modified in a list via a for loop or subroutine.

      f(99) ok that's reasonable.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (4)
As of 2021-07-30 05:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?