此表达式中的优先顺序是什么?

时间:2018-11-25 14:59:44

标签: perl perlop

当我运行此程序时:

print(rand*100)

我得到[0,1)范围内的值。

但是为此:

print(100*rand)

我得到[0,100)范围内的值。

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

3 个答案:

答案 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”是一个有趣的数字,但是我不确定它是如何随机分配的:-)