在尝试分配变量并在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,它是一个列表操作符.
原文地址:https://www.jb51.cc/Perl/172262.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。