Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^4: ternary conditional help

by davido (Cardinal)
on Nov 28, 2016 at 21:16 UTC ( [id://1176738]=note: print w/replies, xml ) Need Help??


in reply to Re^3: ternary conditional help
in thread ternary conditional help

This is because the entire expression is evaluated before being passed as arguments to print. print doesn't get called iteratively for each argument. It gets its arguments, and then iterates.

So that means $a = 2 is evaluated, then ' ', then $a = 3, and then the values of $a, ' ', and $a are passed to print. By the time the expression has been evaluated, $a contains 3 no matter how many times it appears in @_.


Dave

Replies are listed 'Best First'.
Re^5: ternary conditional help (alias)
by tye (Sage) on Nov 28, 2016 at 21:39 UTC

    Well, I would characterize the reason as having more to do with the fact that passing $a = 2 as an argument causes an alias to $a to be put into @_. Had a copy of $a's value been placed into @_ instead, then subsequently changing $a to 3 would not impact that copy.

    print $a = 1, 0+$a, $a = 2, 0+$a, $a = 3, 0+$a; # prints "313233"

    The reason that $a = 2 passes an alias is because it is an "lvalue" expression, which just means that you can do previously mentioned things like ( $a = 2 ) = 3. And the reason that lvalue expressions cause aliases to be passed is two-fold: So you can modify arguments via code like $_[0] = 3 in your sub and because it is more efficient than creating a copy.

    - tye        

Re^5: ternary conditional help
by ikegami (Patriarch) on Nov 29, 2016 at 20:45 UTC

    This is because the entire expression is evaluated before being passed as arguments to print

    No, the arguments are placed on the stack as they are evaluated.

    1. $a = 2 is evaluated and the result ($a) is placed on the stack.
    2. ' ' is evaluated and the result is placed on the stack.
    3. $a = 3 is evaluated and the result ($a) is placed on the stack.
    4. "\n" is evaluated and the result is placed on the stack.
    5. print is evaluated.

    @_ isn't even constructed here since print is an operator, not a sub.

    The reason you get the observed behaviour is that $a itself (not a copy of it) is placed on the stack.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (5)
As of 2024-04-19 12:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found