Reputation: 25133
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?
Upvotes: 1
Views: 79
Reputation: 385809
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
Upvotes: 6
Reputation: 69264
You can always use B::Deparse to see how Perl is parsing an expression.
$ perl -MO=Deparse -e'print(100*rand)'
print 100 * (rand);
-e syntax OK
$ perl -MO=Deparse -e'print(rand*100)'
print rand *100;
-e syntax OK
Upvotes: 2