2012-11-16 37 views
3

我碰巧遇到了一个perl代码,语法如下。Perl中的表示法 - || =运算符是做什么的?

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

语法||=是什么意思?

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

+1

谷歌对随机Perl查询通常不是很有帮助(主要是因为在网上有很多关于Perl的坏消息)。您最好使用Perl文档网页(http://perldoc.perl.org/)或Perl搜索引擎(http://perlhacks.com/search/)。 –

+0

这也是标点很难在Google搜索的事实! – plusplus

回答

9

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

现在它做什么:$lhs ||= $rhs相当于$lhs = $lhs || $rhs。这意味着如果$lhs在Perlish意义上为false,则$rhs被分配给$lhs。这可能是如果$lhsundef,如果它是一个空字符串,这个数字是0

+4

从更广泛的意义上讲,|| =在第一次调用new时,似乎会初始化一个单例。 – ysth

+0

@MortizBunkus它是好的,但它似乎真的Perlish错误。你说过关于'undef'和'numeric zero'和'empty string'。所有的好,我只是想添加“0”和“空列表”。 – gaussblurinc

+0

@loldop,空列表永远不会是错误的。或者是真的。评估空列表的真实性是不可能的。那么,假设你指的是一个列表值。如果你指的是存根操作符('()'),那么提及它和'undef'与提及'0'和'0 + 0'一样多余 – ikegami

8
EXPR1 ||= EXPR2; 

相同

EXPR1 = EXPR1 || EXPR2; 

EXPR1除外只计算一次。这是设置默认值的一种便捷方式。例如:

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

就你而言,你似乎有一个单例构造函数。第一次调用new时,它会创建一个新对象。在后续调用中,它将返回以前创建的对象。

2
$x ||= $y; 

是相同

$x = $x || $y; 
3

只是为了完成这一点,在非古代版本的Perl (自5.10),您可以使用定义,或运营商//,而不是真或||,用它设置默认值时具有更好的语义:

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

例如设置此变量的值,以42 当且仅当$foo处于Perlish的感假。问题是,这个操作符不能区分undefined值中的定义但是错误的值,因为两者都是错误的。

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

该行设置$foo价值当且仅当这是以前没有定义,这就是我们经常想。它也很短,完全像||