【问题标题】:Is there a Perl equivalent to the null coalescing operator (??) in C#?是否有与 C# 中的空合并运算符 (??) 等效的 Perl?
【发布时间】:2010-12-25 21:41:11
【问题描述】:

我开始非常喜欢 C# 的 ?? 运算符。而且我已经习惯了这样一个事实,即在某些语言中有一些方便的地方,它很可能也在 Perl 中。

但是,我找不到?? Perl 中的等价物。有吗?

【问题讨论】:

  • 它可能对那些熟悉 Perl 但不熟悉 C# 的人有所帮助,如果你解释一下 ??运营商会。
  • @pavium:这是 MSDN 文档的链接?运营商:msdn.microsoft.com/en-us/library/ms173224.aspx
  • 澄清什么??意思是,$a ?? 5$a != null ? $a : 5 相同,这意味着如果 $a 不为 NULL,则表达式的结果为 $a,否则结果为 5。如果为 null,则验证为默认值$a = $a ?? 5 很有用。

标签: c# perl null-coalescing-operator


【解决方案1】:

这个问题暗示了任意数量的参数,所以答案暗示了一个子程序:

你明白了 - 将返回列表的第一个定义/非空字符串值:

sub coalesce { (grep {length} @_)[0] }

【讨论】:

  • 我觉得没必要,多次使用//也应该可以。
【解决方案2】:

从 5.10 开始,有 // 运算符,如果您认为 Perl 中的 undef 概念等同于 C# 中的 null 概念,则它在语义上是等效的。

示例 A:

my $a = undef;
my $b = $a // 5;  # $b = 5;

示例 B:

my $a = 0;
my $b = $a // 5;  # $b = 0;

【讨论】:

  • 是的,我自动认为 undef 等同于 NULL,谢谢
  • 5.10 之前的成语只是defined($a) ? $a : $b,它可以完成工作并且读起来足够清晰。
  • hobbs:是的,但我必须写 2 次(这不一样,例如,调用子程序)
  • 顺便说一句,我真的很喜欢我的前提“当功能很好时,它可能也在 perl 中”仍然成立:)
【解决方案3】:

Adam says 一样,Perl 5.10 有一个// 运算符来测试其左手运算符的定义性而不是真实性:

 use 5.010;

 my $value = $this // $that;

如果您使用的是早期版本的 Perl,那就有点乱了。 || 不起作用:

 my $value = $this || $that;

在这种情况下,如果$this 为0 或空字符串,两者都已定义,您将得到$that。为了解决这个问题,习惯用法是使用条件运算符,以便您可以进行自己的检查:

 my $value = defined( $this ) ? $this : $that;

【讨论】:

    【解决方案4】:

    实际上,短路 OR 运算符在评估 undef 时也可以工作:

    my $b = undef || 5;  # $b = 5;
    

    但是,当评估为 0 但为真时,它会失败:

    my $b = 0 || 5;  # $b = 5;
    

    【讨论】:

      【解决方案5】:

      我不知道。

      Perl 并不是 null 概念的真正大用户。它确实对变量是否未定义进行了测试。没有像 ?? 这样的特殊运算符不过,您可以使用条件 ?: 运算符与 undef 测试并获得非常接近。

      我也没有在 perl operator list 中看到任何内容。

      【讨论】:

      • 好吧,你没有回答我,但是感谢页面,我意识到我的问题有点不对劲,我可以使用简单的 || (我把它作为一个单独的答案)
      猜你喜欢
      • 2011-06-26
      • 2014-12-04
      • 2014-03-10
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2010-12-19
      • 2012-06-07
      相关资源
      最近更新 更多