3

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

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

语法||=是什么意思?

我未能将其作为关键字进行谷歌搜索,并且在 perldoc 中找不到类似的语法。

4

5 回答 5

9

您将在perlop中找到运算符的含义。

现在它的作用:$lhs ||= $rhs相当于$lhs = $lhs || $rhs. 这意味着在 Perlish 意义上$rhs分配给$lhsif为 false 。$lhs这可以是 if $lhsis undef,如果是空字符串,则为 0 的数字。

于 2012-11-16T08:29:32.813 回答
8
EXPR1 ||= EXPR2;

是相同的

EXPR1 = EXPR1 || EXPR2;

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

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

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

于 2012-11-16T08:29:14.040 回答
3

x ||= y是缩写x = x || y

请参阅perlop 文档

于 2012-11-16T08:29:06.047 回答
3

为了完成这一点,在 perl 的非古代版本(自 5.10 起)中,您可以使用defined-or 运算符//而不是 truth-or ||,它在使用它来设置默认值时具有更好的语义:

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

例如将这个变量的值设置为 42 iff $foo在 perlish 意义上是假的。问题是,该运算符无法区分已定义但为假的值和未定义的值,因为两者都是假的。

$foo //= 42;    # $foo = $foo // 42;

这行设置$foos 值,如果它之前未定义,这是我们经常想要的。它也很短路,就像||.

于 2012-11-16T09:22:46.090 回答
2
$x ||= $y;

$x = $x || $y;
于 2012-11-16T08:29:54.087 回答