当我运行此程序时:
print(rand*100)
我得到[0,1)
范围内的值。
但是为此:
print(100*rand)
我得到[0,100)
范围内的值。
这里的优先顺序是什么?为什么第一个表达式不返回[0,100)
范围内的值?
答案 0 :(得分:6)
rand
具有两种语法:
rand
rand EXPR
如果rand
之后的内容可以是表达式(EXPR
)的开头,则Perl假定您使用的是后者形式。
*
可以启动EXPR
,因此rand*...
被解析为rand EXPR
。这意味着rand*100
等效于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
答案 1 :(得分:2)
您始终可以使用B::Deparse来查看Perl如何解析表达式。
$ 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
答案 2 :(得分:0)
问题不在于前提,而在于语法。球体“ *”的存在使该数字不可行。
print rand 100;
= 0-100
print (rand(100));
...给出相同的结果。
print rand *100
...被忽略
基本上,您已经创建了一个数字“ * 100”。 “ i100”是一个有趣的数字,但是我不确定它是如何随机分配的:-)