我碰巧遇到了一个带有以下语法的perl代码。
sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}
语法||=
是什么意思?
我没有把它作为一个关键词,我在perldoc中找不到类似的语法。
答案 0 :(得分:9)
您可以在perlop中找到运算符的含义。
现在它的作用:$lhs ||= $rhs
相当于$lhs = $lhs || $rhs
。这意味着$rhs
如果在Perlish意义上$lhs
为假,则会$lhs
分配给$lhs
。如果undef
为{{1}},则为{{1}},如果为空字符串,则为0。
答案 1 :(得分:8)
EXPR1 ||= EXPR2;
与
相同EXPR1 = EXPR1 || EXPR2;
除了EXPR1
只评估一次。这是设置默认值的便捷方式。例如:
sub foo {
my %args = @_;
$args{host} ||= "localhost"; # Provide a default host name if none provided.
...
}
在您的情况下,您似乎有一个单例构造函数。第一次调用new
时,它会创建一个新对象。在后续调用中,它将返回先前创建的对象。
答案 2 :(得分:3)
x ||= y
是x = x || y
答案 3 :(得分:3)
要完成此操作,在非古代版本的perl(自5.10开始)中,您可以使用已定义或操作符//
而不是真实 - 或||
,使用它来设置默认值时具有更好的语义:
$foo ||= 42; # $foo = $foo || 42;
例如,将此变量的值设置为42 iff $foo
在perlish意义上为false。问题是,此运算符无法区分已定义但错误的值与未定义的值,因为两者都是错误的。
$foo //= 42; # $foo = $foo // 42;
此行设置$foo
的值 iff 之前未定义,这是我们经常需要的。它也是短暂的,完全像||
。
答案 4 :(得分:2)
$x ||= $y;
与
相同$x = $x || $y;