1

当我运行这个程序时:

print(rand*100)

我从[0,1)范围中获取值。

但为此:

print(100*rand)

我从[0,100)范围中获取值。

这里的优先级是什么?为什么第一个表达式不返回[0,100)范围内的值?

4

3 回答 3

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
于 2018-11-25T15:09:58.343 回答
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
于 2018-11-25T15:12:04.017 回答
0

问题不在于总统,而在于语法。全局“*”的存在,这使得数字不可用。

print rand 100;

= 0 - 100

print (rand(100)); 

...给出相同的结果。

print rand *100

...被忽略

基本上你已经创建了一个数字“*100”。然而,“i100”是一个有趣的数字,但我不确定它是如何随机化的 :-)

于 2018-11-25T15:18:45.840 回答