Perl中是否有类似于C#中空合并运算符(??)的等效操作符?

23

我开始真的喜欢C#的 ?? 操作符。而且我很习惯于这个事实,即在某些语言中有方便的东西,它很可能也在Perl中存在。

然而,我找不到Perl中的 ?? 等效物。是否有任何替代方案?


11
如果您解释一下 ?? 运算符的作用,那么可能会对熟悉 Perl 但不熟悉 C# 的人有所帮助。 - pavium
1
@pavium:这是关于 ?? 运算符的 MSDN 文档链接:http://msdn.microsoft.com/zh-cn/library/ms173224.aspx - Adam Bellaire
1
为了澄清 ?? 的含义,$a ?? 5$a != null ? $a : 5 是相同的,这意味着如果 $a 不是 NULL,则表达式的结果为 $a,否则结果为 5。如果要将变量默认为一个值,它非常有用,例如 $a = $a ?? 5 - Despertar
5个回答

42

自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。谢谢。 - Karel Bílek
3
“pre-5.10”的惯用法只是defined($a) ? $a : $b,它可以胜任工作并且读起来足够清晰。 - hobbs
霍布斯:是的,但我得写两次(如果是对子程序的调用,那就不一样了)。 - Karel Bílek
4
顺便提一句,我真的很喜欢我的前提:“当一个功能好用时,它很可能也在 Perl 中出现”仍然成立 :) - Karel Bílek

9

正如Adam所说,Perl 5.10有一个//运算符,它测试其左操作数是否已定义而不是真值:

 use 5.010;
 
 my $value = $this // $that;

如果您使用的是早期版本的Perl,那么会有些混乱。 || 将无法正常工作:
 my $value = $this || $that;

在这种情况下,如果$this是0或空字符串,这两个都已定义,你将得到$that。为了避免这种情况,惯用法是使用条件运算符,这样你就可以进行自己的检查:

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

1

实际上,短路或运算符在评估未定义时也可以工作:

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

然而,当评估0但为真时,它将失败:

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

0

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

在这里,它将返回列表中第一个已定义/非空字符串值:

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

我认为这并不必要,使用//多次应该也可以。 - svick

-4

我并不知道有没有。

Perl并不是很常用null概念。它确实有一个测试变量是否未定义的函数。虽然没有像??这样的特殊操作符,但您可以使用条件?:操作符进行undef测试,并且可以得到非常接近的效果。

在perl 运算符列表中也没有发现任何内容。


好的,你没有回答我的问题,但是感谢这个页面,我意识到我的问题有点偏离了,我可以使用简单的 ||(我将其作为一个单独的答案)。 - Karel Bílek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接