我碰巧遇到了一个具有以下语法的 perl 代码。
sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}
语法||=
是什么意思?
我未能将其作为关键字进行谷歌搜索,并且在 perldoc 中找不到类似的语法。
您将在perlop中找到运算符的含义。
现在它的作用:$lhs ||= $rhs
相当于$lhs = $lhs || $rhs
. 这意味着在 Perlish 意义上$rhs
分配给$lhs
if为 false 。$lhs
这可以是 if $lhs
is undef
,如果是空字符串,则为 0 的数字。
EXPR1 ||= EXPR2;
是相同的
EXPR1 = EXPR1 || EXPR2;
除了EXPR1
只评估一次。这是设置默认值的便捷方式。例如:
sub foo {
my %args = @_;
$args{host} ||= "localhost"; # Provide a default host name if none provided.
...
}
在您的情况下,您似乎有一个单例构造函数。第一次new
调用它时,它将创建一个新对象。在后续调用中,它将返回先前创建的对象。
x ||= y
是缩写x = x || y
请参阅perlop 文档。
为了完成这一点,在 perl 的非古代版本(自 5.10 起)中,您可以使用defined-or 运算符//
而不是 truth-or ||
,它在使用它来设置默认值时具有更好的语义:
$foo ||= 42; # $foo = $foo || 42;
例如将这个变量的值设置为 42 iff $foo
在 perlish 意义上是假的。问题是,该运算符无法区分已定义但为假的值和未定义的值,因为两者都是假的。
$foo //= 42; # $foo = $foo // 42;
这行设置$foo
s 值,如果它之前未定义,这是我们经常想要的。它也很短路,就像||
.
$x ||= $y;
和
$x = $x || $y;