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

时间:2012-11-16 08:26:22

标签: perl notation

我碰巧遇到了一个带有以下语法的perl代码。

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

语法||=是什么意思?

我没有把它作为一个关键词,我在perldoc中找不到类似的语法。

5 个答案:

答案 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 ||= yx = x || y

的缩写

请参阅perlop documentation

答案 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;