加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中分配和测试定义时,了解优先级

发布时间:2020-12-15 21:22:32 所属栏目:大数据 来源:网络整理
导读:在尝试分配变量并在Perl中的一个操作中测试它的定义时,例如在if的条件下会很有用,我写它似乎很自然: if ( defined my $thing = $object-get_thing ) { $thing-do_something;} 据我所知,定义的优先级为rightward list operator,低于赋值的优先级,因此我希望
在尝试分配变量并在Perl中的一个操作中测试它的定义时,例如在if的条件下会很有用,我写它似乎很自然:
if ( defined my $thing = $object->get_thing ) {
    $thing->do_something;
}

据我所知,定义的优先级为rightward list operator,低于赋值的优先级,因此我希望上面的代码等同于:

if ( defined ( my $thing = $object->get_thing ) ) {
    $thing->do_something;
}

虽然后者,带括号的代码确实有效,但前者会产生以下致命错误:“无法在标量赋值中修改已定义的运算符”.

添加括号并不是什么大不了的事,但我很想理解为什么第一个版本不起作用,例如什么样的“事物”定义是什么,它的优先级是什么?

解决方法

命名运算符分为一元运算符(总是只运算一个操作数的运算符)和列表运算符(其他所有)[1].

已定义且我的[2]是一元运算符,其优先级高于其他命名运算符.

对于subs来说也是如此,所以我将用它们来演示.

$perl -MO=Deparse,-p -e'sub f :lvalue {}  sub g :lvalue {}  f g $x = 123;'
sub f : lvalue { }
sub g : lvalue { }
f(g(($x = 123)));
-e syntax OK

$perl -MO=Deparse,-p -e'sub f($) :lvalue {}  sub g($) :lvalue {}  f g $x = 123;'
sub f ($) : lvalue { }
sub g ($) : lvalue { }
(f(g($x)) = 123);
-e syntax OK

但是,当然,定义的不是左值函数,因此在赋值的LHS上找到它会导致错误.

>和,或者,不是,xor,lt,le,gt,ge,eq,ne和cmp不被视为命名运算符.>我很不寻常.除了具有编译时和运行时效果之外,其语法还取决于是否在其参数周围使用了parens.没有parens,它是一个一元的操作符.有了parens,它是一个列表操作符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读