【问题标题】:What is precedence in this expression?这个表达式中的优先级是什么?
【发布时间】:2018-11-25 14:59:44
【问题描述】:

当我运行这个程序时:

print(rand*100)

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

但是对于这个:

print(100*rand)

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

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

【问题讨论】:

    标签: perl perlop


    【解决方案1】:

    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
    

    【讨论】:

    • 让这种歧义变得更加有趣的两件事:符号和变量名之间的空格是允许的,所以rand * 100 仍然没有避免这个问题;它也发生在rand / 100 上,一旦解析器意识到没有关闭/,就会导致解析错误。
    【解决方案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
    

    【讨论】:

    • 多么荣幸……我的书架上实际上有你的“使用 Perl 进行数据处理”。比喻不止一种;-)
    【解决方案3】:

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

    print rand 100;
    

    = 0 - 100

    print (rand(100)); 
    

    ...给出相同的结果。

    print rand *100
    

    ...被忽略

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

    【讨论】:

    • 这个数字不是*100,而是变量*100的数字化,此时它是一个未定义的glob。
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2011-05-14
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多