使用“undef”初始化自我记录代码?

时间:2012-07-26 02:23:29

标签: perl undef

有时我想写:

my $var = shift // undef;    # argument is optional
                             # or

my $var = $val{optional_value} // undef;

表示可以缺少参数,否则// undef当然没用。

这有多贵,是否被编译器优化了?

3 个答案:

答案 0 :(得分:7)

我确定它不是很贵,但我不得不说

my $var = shift // undef;

不像

那么明确
my $var = shift;    # argument is optional

my $var = shift;    # optional; undef if omitted

这两者在运行时肯定(虽然几乎没有)更便宜。如果你还是需要评论(为了清楚起见),那么// undef除了不必要的操作码之外真正添加了什么?

答案 1 :(得分:1)

回答你的问题:不,不。

答案 2 :(得分:0)

我尝试了一个基准:

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)

结果证实了上述内容。