有时我想写:
my $var = shift // undef; # argument is optional
# or
my $var = $val{optional_value} // undef;
表明可以缺少参数,否则// undef
当然是无用的。
这有多贵,编译器是否对其进行了优化?
我敢肯定它不是很贵,但我不得不说
my $var = shift // undef;
并不像
my $var = shift; # argument is optional
或者
my $var = shift; # optional; undef if omitted
这两者在运行时肯定(尽管几乎没有)便宜。如果您仍然需要注释(为了清楚起见),那么// undef
除了不必要的操作码之外,真正添加了什么?
回答你的问题:不是和不是。
我尝试了一个基准:
use strict;
use Benchmark qw(:all);
sub shu
{
my $x = shift // undef;
return $x // 0;
}
sub sh
{
my $x = shift;
return $x // 0;
}
timethese ( 100_000_000, { shu => \&shu, sh => \&sh } );
# outputs:
# Benchmark: timing 100000000 iterations of sh, shu...
# sh: 14 wallclock secs (14.95 usr + -0.06 sys = 14.89 CPU) @ 6715916.72/s (n=100000000)
# shu: 16 wallclock secs (16.74 usr + -0.02 sys = 16.72 CPU) @ 5980861.24/s (n=100000000)
所以结果证实了上面所说的。