Search code examples
perlperlop

What is precedence in this expression?


When I run this program:

print(rand*100)

I get values from [0,1) range.

But for this:

print(100*rand)

I get values from [0,100) range.

What is precedence here? and why first expression does not return values from [0,100) range?


Solution

  • rand has two syntax:

    • rand
    • rand EXPR

    If what follows rand can be the start of an expression (EXPR), Perl assumes you are using the latter form.

    * can start an EXPR, so rand*... is parsed as rand EXPR. This means that rand*100 is equivalent to rand(*100).

    $ perl -MO=Deparse,-p -wle'print(rand*100)'
    BEGIN { $^W = 1; }
    BEGIN { $/ = "\n"; $\ = "\n"; }
    print(rand(*100));
    -e syntax OK
    
    $ perl -wle'print(rand*100)'
    Argument "*main::100" isn't numeric in rand at -e line 1.
    0.57355563536203