Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^4: grep for hash?

by ikegami (Patriarch)
on Jul 07, 2009 at 15:50 UTC ( [id://777916]=note: print w/replies, xml ) Need Help??


in reply to Re^3: grep for hash?
in thread grep for hash?

I think it's pretty safe to count that the rvalue will be computed and available before the lvalue is populated with it.

In general, no. The container can be placed on the stack before the value it will receive. The assignment only occurs after both the value and the container are on the stack.

In Perl, operands are always evaluated from left to right, except the operands for assignment operators are always evaluated from right to left. But that's not documented.

GivenDisinguishes these Interpretations
Operator Precedence1+2*3(1+2)*3
-vs-
1+(2*3)
Operator Associativity2**3**4(2**3)**4
-vs-
2**(3**4)
Operand Evaluation Orderfoo()+bar()foo() -> bar() -> add
-vs-
bar() -> foo() -> add

Update: I foresaw confusion between operator associativity and operand evaluation order, so I added the table.

Replies are listed 'Best First'.
Re^5: grep for hash?
by Fletch (Bishop) on Jul 07, 2009 at 16:34 UTC

    It's not explicitly documented but it's stated in perlsyn that the assignment operator works "as in C", and it has the same right-to-left associativity as C's, and the value of the assignment is itself a valid rvalue for another subsequent assignment. Granted it's not chiseled into stone tablets, but I don't think that it's a "ZOMGWTFBBQ no one knows what'll happen just don't do that" case like ++$a + $a++ is.

    That being said, your alternative with the separate assignment before use is definitely a clearer implementation.

    The cake is a lie.
    The cake is a lie.
    The cake is a lie.

      it has the same right-to-left associativity as C's

      Operator associativity is not related to operand evaluation order.

      Perl even have a case where they differ. Exponentiation is right-associative, but its operands are evaluated from left to right.

      it's stated in perlsyn that the assignment operator works "as in C"

      Operand evaluation order is not defined in C, and different compilers use different orders. (Well, so I was told.)

      but I don't think that it's a "ZOMGWTFBBQ no one knows what'll happen just don't do that

      I agree. Especially since my $x = $x; relies on it.

        That's one I didn't know; a new corner case to file away.

        $ perl -le 'print +(do{ print STDERR "ORLY?"; 2})**(do{ print STDERR " +YARLY!"; 3})' ORLY? YARLY! 8

        The cake is a lie.
        The cake is a lie.
        The cake is a lie.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2024-04-19 08:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found