我碰巧遇到了一个具有以下语法的 perl 代码。
sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}
语法||=是什么意思?
我未能将其作为关键字进行谷歌搜索,并且在 perldoc 中找不到类似的语法。
您将在perlop中找到运算符的含义。
现在它的作用:$lhs ||= $rhs相当于$lhs = $lhs || $rhs. 这意味着在 Perlish 意义上$rhs分配给$lhsif为 false 。$lhs这可以是 if $lhsis 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;
这行设置$foos 值,如果它之前未定义,这是我们经常想要的。它也很短路,就像||.
$x ||= $y;
和
$x = $x || $y;