【问题标题】:Notation in Perl - what does the ||= operator do?Perl 中的符号 - ||= 运算符做什么?
【发布时间】:2012-11-16 08:26:21
【问题描述】:

我碰巧遇到一个perl代码,语法如下。

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

||= 的语法是什么意思?

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

【问题讨论】:

  • Google 通常对随机 Perl 查询没有多大帮助(主要是因为网络上有太多关于 Perl 的不良信息)。您最好使用 Perl 文档网页 (perldoc.perl.org) 或 Perl 搜索引擎 (perlhacks.com/search)。
  • 标点符号在谷歌中很难搜索!

标签: perl notation


【解决方案1】:

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

现在它做了什么:$lhs ||= $rhs 等同于 $lhs = $lhs || $rhs。这意味着如果 $lhs 在 Perlish 意义上为 false,则将 $rhs 分配给 $lhs。这可以是如果$lhsundef,如果是空字符串,则为0。

【讨论】:

  • 在更广泛的意义上,||= 这里似乎是在第一次调用 new 时初始化一个单例。
  • @MortizBunkus 这很好,但似乎真的是 Perlish 错误。你说过undefnumeric zeroempty string。很好,我只想添加"0"empty list
  • @loldop,空列表永远不会是假的。或者是真的。评估空列表的真实性是不可能的。好吧,这是假设您指的是列表值。如果您指的是存根运算符 (()),那么同时提及它和 undef 与提及 00+0 一样多余。
【解决方案2】:
EXPR1 ||= EXPR2;

一样
EXPR1 = EXPR1 || EXPR2;

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

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

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

【讨论】:

    【解决方案3】:

    x ||= yx = x || y 的缩写

    请参阅perlop documentation

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:
        $x ||= $y;
        

        相同
        $x = $x || $y;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多