Perl中的符号表示法 - ||= 运算符是什么?

3

我偶然遇到了一段具有以下语法的Perl代码。

sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}

语法||=是什么意思?

我尝试使用关键词在谷歌中搜索,但未能找到类似的语法。在perldoc中也没有找到相关内容。


1
Google对于随机的Perl查询通常不是很有帮助(主要是因为网络上有太多关于Perl的错误信息)。最好使用Perl文档网页(http://perldoc.perl.org/)或Perl搜索引擎(http://perlhacks.com/search/)。 - Dave Cross
这也是事实,标点符号在谷歌搜索中很难查找! - plusplus
5个回答

9
您可以在perlop中找到运算符的含义。
现在让我们来看看它的作用: $lhs ||= $rhs 相当于 $lhs = $lhs || $rhs。这意味着如果$lhs在Perlish意义下为假,那么$rhs将被赋值给$lhs。这可能是因为$lhsundef,或者是一个空字符串,或者是一个值为0的数字。

4
更广义地说,这里的 ||= 似乎是在第一次调用 new 时初始化一个单例。 - ysth
@MortizBunkus 这很好,但它看起来非常像 Perl 的 false。你提到了 undefnumeric zeroempty string。都很好,我只想添加 "0"empty list - gaussblurinc
@loldop,空列表既不是真也不是假。评估空列表的真假是不可能的。假设您正在引用列表值。如果您正在引用存根运算符(()),那么同时提到它和undef就像提到00+0一样多余。 - ikegami

8
EXPR1 ||= EXPR2;

等同于

EXPR1 = EXPR1 || EXPR2;

除非EXPR1只被评估一次。这是设置默认值的便捷方式。例如:

sub foo {
   my %args = @_;
   $args{host} ||= "localhost";  # Provide a default host name if none provided.
   ...
}

在您的情况下,您似乎有一个单例构造函数。第一次调用new时,它将创建一个新对象。在后续调用中,它将返回先前创建的对象。

3

为了完善这个问题,在非古老版本的Perl中(自5.10以来),您可以使用定义或运算符//代替真值或||,当将其用于设置默认值时,它具有更好的语义:

$foo ||= 42;    # $foo = $foo || 42;

例如,当且仅当在Perl语言的意义下,$foo为假值时,此操作符将该变量的值设置为42。问题在于,这个操作符无法区分已定义但为假值和未定义的情况,因为两者都被视为假值。
$foo //= 42;    # $foo = $foo // 42;

这行代码设置了$foo的值,只有在之前它没有定义的情况下才会设置,这通常是我们想要的。它也像||一样短路。


3

2
$x ||= $y;

相同
$x = $x || $y;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接