Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re^3: eval order of args to a sub

by TGI (Parson)
on May 30, 2007 at 20:48 UTC ( #618320=note: print w/replies, xml ) Need Help??


in reply to Re^2: eval order of args to a sub
in thread eval order of args to a sub

I think the moral of the story is "understand what you are passing to your functions".

It appears that most ways that one might modify a variable in a function call will result in an alias to the variable being passed. Post-increment seems to be unique in that it creates an anonymous value.

C:\>perl -e "sub foo{ print join qq/\n/, map { \$_ .' - ' . $_ } @_ } +foo($i=1,++$i,$i++,$i+1,$i+=1,$i); SCALAR(0x183059c) - 4 SCALAR(0x183059c) - 4 SCALAR(0x225f7c) - 2 SCALAR(0x18305fc) - 4 SCALAR(0x183059c) - 4 SCALAR(0x183059c) - 4


TGI says moo

Replies are listed 'Best First'.
Re^4: eval order of args to a sub
by Joost (Canon) on May 30, 2007 at 21:15 UTC
    Post-increment seems to be unique in that it creates an anonymous value.
    That doesn't suprise me. post-increment and post-decrement return (a copy of) the old value, while changing the original value. What I mean is, since post-*crement creates 2 values from one variable, you need a copy somewhere, and it makes sense (for ease of coding and performance - perl variables are passed by reference internally) to increment the original value and create a copy as the return value of the *crementation.

      Absolutely, the post-*crement operators MUST create an anonymous value, so they do.

      I wonder though, what the "expected" or "natural" behavior of the other constructs I posted should be.

      Construct Behavior Expected $i += 2 \$i ??? $i++ Anon. Anon. $i + 1 Anon. Anon. $i++ Anon. Anon. ++$i \$i Anon. $i=2 \$i ???

      From reading the other posts here, I feel comfortable saying that people expect ++$i to pass an anonymous value. I'm not 100% sure what I'd expect the assignment operators (=, *=, etc) to pass. Since most langauges pass by value, I guess I'd expect the assignment operators to pass anonymous values equal to the value assigned to $i. For example for foo($i=2) my faulty intuition is that foo() would get an anonymous 2 in $_[0].


      TGI says moo

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://618320]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (9)
As of 2017-12-15 20:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What programming language do you hate the most?




















    Results (443 votes). Check out past polls.

    Notices?