Perl中的表示法,| |=运算符的作用是什么?

Perl中的表示法,| |=运算符的作用是什么?,perl,notation,Perl,Notation,我碰巧遇到一个具有以下语法的perl代码 sub new{ my ($class, $value)=@_; $lobby ||= bless{ e=>undef;},$class } 语法| |=是什么意思 我没能把它作为关键词用谷歌搜索,在perldoc中也找不到类似的语法。x | |=y是x=x | | y 看 与 EXPR1 = EXPR1 || EXPR2; EXPR1只计算一次。这是一种设置默认值的方便方法。例如: sub foo { my %args = @_;

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

sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}
语法
| |=
是什么意思


我没能把它作为关键词用谷歌搜索,在perldoc中也找不到类似的语法。

x | |=y
x=x | | y

EXPR1 = EXPR1 || EXPR2;
EXPR1只计算一次。这是一种设置默认值的方便方法。例如:

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

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

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

现在,它的作用是:
$lhs | |=$rhs
相当于
$lhs=$lhs | |$rhs
。这意味着如果
$lhs
在最高意义上为false,则将
$rhs
分配给
$lhs
。如果
$lhs
未定义的
,如果是空字符串,则为0

$x ||= $y;

$x = $x || $y;

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

$foo ||= 42;    # $foo = $foo || 42;
例如,如果
$foo
在某种意义上为false,则将此变量的值设置为42。问题是,此运算符无法区分已定义但为false的值和未定义的值,因为两者都为false

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

这行设置了
$foo
s的值,如果它以前未定义,这是我们经常需要的。它也很短,就像广义上的
| |

,| |=在第一次调用new时,这里似乎正在初始化一个单例。@MortizBunkus它是好的,但它看起来确实是错误的。你说的是
undef
数字零
空字符串
。很好,我只想添加
“0”
空列表
@loldop,空列表从来都不是假的。或者是真的。不可能评估空列表的真实性。好吧,假设你指的是一个列表值。如果您指的是存根操作符(
()
),那么同时提到它和
unde
与提到
0
一样多余,
0+0
谷歌对于随机的Perl查询通常没有多大帮助(主要是因为web上有太多关于Perl的错误信息)。您最好使用Perl文档网页()或Perl搜索引擎()。事实上,标点符号在Google中很难搜索!
$foo //= 42;    # $foo = $foo // 42;