Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re: Modifying passed-in variables

by mr_ron (Chaplain)
on Nov 02, 2015 at 19:32 UTC ( [id://1146742]=note: print w/replies, xml ) Need Help??


in reply to Modifying passed-in variables

Please remember to "use strict;" and "use warnings;". I reproduced the error "Modification of a read-only value" based on the incomplete code fragments you provided by commenting out "use strict;". Once you apply strict you get a more informative message that might have avoided this post.

use strict; use warnings; my $d = 3; sub foo { my ($data) = @_; $$data++; } eval {foo($d);}; print $@; # prints informative message provided by strict foo(\$d); print "$d\n"; __END__ Can't use string ("3") as a SCALAR ref while "strict refs" in use ... 4
Ron

Replies are listed 'Best First'.
Re^2: Modifying passed-in variables
by mike65535 (Novice) on Nov 03, 2015 at 13:50 UTC
    Thanks for the relies.

    Rolf: The code I posted (more or less) is being used in some sample code I'm looking at. Is that an old Perl construct - i.e., no longer valid?

    Ron: I did try with "strict" and "warnings" on. And I got a more verbose message, but to this noob, it wasn't more informative. LOL

    tonto: Close, yes; I forgot to include (apologies) the function call in the post, however I still wanted the intended functionality of the $$data++ (double "dollar sign") statement (IOW, modifying the value of $data as the calling function would see it). That's the whole point of my post. Thanks again for your time.

      I'm prepared to bet the error you got was: Can't use string ("3") as a SCALAR ref while "strict refs". This is one reason why your function isn't very friendly.

      What your function is doing is _expecting_ a reference, then modifying the value referenced. So you can call it by:

      foo ( \$data );
      Which is passing in a reference, that then "foo" alters. Because otherwise what you're doing is: ${'3'}++ which doesn't make a lot of sense.

      Action at a distance like that is generally considered bad form - you don't know what what the subroutine "foo" is doing to your local variable. So normally, what you would expect to pass in a value, and get back a result.

      You should probably note - you _do_ get a result back from your subroutine, that's the initial (pre-increment) value of $data. That can be confusing

      Here are some guesses at what the proprietary code you have may resemble (more or less). Two have been discussed,  bar() is new. All are valid constructs in the sense that they are not deprecated as of 5.14. Whether they are good ideas or not is another question. Please pick one of these as the closest to what you have:

      c:\@Work\Perl>perl -wMstrict -le "print qq{perl version $]}; ;; sub foo { my ($data) = @_; $$data++; } ;; my $x = 3; foo(\$x); print $x; ;; sub bar (\$) { my ($data) = @_; $$data++; } bar($x); print $x; ;; sub bof { $_[0]++; } bof($x); print $x; " perl version 5.008009 4 5 6


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

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (4)
As of 2024-04-25 09:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found