我开始真的喜欢C#的 ?? 操作符。而且我很习惯于这个事实,即在某些语言中有方便的东西,它很可能也在Perl中存在。
然而,我找不到Perl中的 ?? 等效物。是否有任何替代方案?
我开始真的喜欢C#的 ?? 操作符。而且我很习惯于这个事实,即在某些语言中有方便的东西,它很可能也在Perl中存在。
然而,我找不到Perl中的 ?? 等效物。是否有任何替代方案?
自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;
defined($a) ? $a : $b
,它可以胜任工作并且读起来足够清晰。 - hobbs正如Adam所说,Perl 5.10有一个//
运算符,它测试其左操作数是否已定义而不是真值:
use 5.010;
my $value = $this // $that;
||
将无法正常工作: my $value = $this || $that;
在这种情况下,如果$this
是0或空字符串,这两个都已定义,你将得到$that
。为了避免这种情况,惯用法是使用条件运算符,这样你就可以进行自己的检查:
my $value = defined( $this ) ? $this : $that;
实际上,短路或运算符在评估未定义时也可以工作:
my $b = undef || 5; # $b = 5;
然而,当评估0但为真时,它将失败:
my $b = 0 || 5; # $b = 5;
这个问题暗示了任意数量的参数,因此答案暗示了一个子程序:
在这里,它将返回列表中第一个已定义/非空字符串值:
sub coalesce { (grep {length} @_)[0] }
//
多次应该也可以。 - svick我并不知道有没有。
Perl并不是很常用null概念。它确实有一个测试变量是否未定义的函数。虽然没有像??这样的特殊操作符,但您可以使用条件?:操作符进行undef测试,并且可以得到非常接近的效果。
在perl 运算符列表中也没有发现任何内容。
$a ?? 5
和$a != null ? $a : 5
是相同的,这意味着如果 $a 不是 NULL,则表达式的结果为 $a,否则结果为 5。如果要将变量默认为一个值,它非常有用,例如$a = $a ?? 5
。 - Despertar