【发布时间】:2018-11-25 14:59:44
【问题描述】:
当我运行这个程序时:
print(rand*100)
我从[0,1) 范围内获取值。
但是对于这个:
print(100*rand)
我从[0,100) 范围内获取值。
这里的优先级是什么?为什么第一个表达式不返回 [0,100) 范围内的值?
【问题讨论】:
当我运行这个程序时:
print(rand*100)
我从[0,1) 范围内获取值。
但是对于这个:
print(100*rand)
我从[0,100) 范围内获取值。
这里的优先级是什么?为什么第一个表达式不返回 [0,100) 范围内的值?
【问题讨论】:
rand 有两种语法:
randrand 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
【讨论】:
rand * 100 仍然没有避免这个问题;它也发生在rand / 100 上,一旦解析器意识到没有关闭/,就会导致解析错误。
您总是可以使用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
【讨论】:
问题不在于总统,而在于语法。全局“*”的存在,这使得数字无法使用。
print rand 100;
= 0 - 100
print (rand(100));
...给出相同的结果。
print rand *100
...被忽略
基本上你已经创建了一个数字“*100”。然而,“i100”是一个有趣的数字,但我不确定它是如何随机化的 :-)
【讨论】:
*100,而是变量*100的数字化,此时它是一个未定义的glob。