如何在perl中返回长度为0的空数组/数组?

Pet*_*rch 2 perl

我想返回一个空数组,而不是一个空列表.

我有一个返回一系列事物的子.我希望能够用它做到这一点:

my $count = scalar getArray();
Run Code Online (Sandbox Code Playgroud)

我是这样做的:

sub getArray {
    if ( !isGood() ) {
        return ();
    } else {
        my @array = calculateSomehow();
        return @array;
    }
}
my $count = scalar getArray();
Run Code Online (Sandbox Code Playgroud)

我有一个惊喜的时候!isGood(),并$count成为undef,不0!读完perlfaq4之后,我意识到这是因为getArray()是在标量上下文中计算的,因此列表 ()被评估为标量,而且scalar( () )undef,而my @array; scalar( @array )0是.

现在的问题是:我如何最优雅地返回一个空数组,那么如果$count是这样的0!isGood()?我只想出:

# This is kind of kludgy: Dereference an anonymous array ref. Really?
return @{[]};
Run Code Online (Sandbox Code Playgroud)

要么

# I use a temporary variable for this. Really?
my @empty;
return @empty;
Run Code Online (Sandbox Code Playgroud)

是不是有更清晰/更优雅的方式返回长度为0 的数组(空数组)或其他一些scalar getArray()评估方式0

Sea*_*ean 6

如果你在两种情况下只返回一个数组,它可能是最清楚的:

sub getArray {
    my @array;
    @array = calculateSomehow() if isGood();
    return @array;
}
Run Code Online (Sandbox Code Playgroud)

但要以最小的方式修改原始代码,请使用wantarray.

if (!isGood()) {
    return wantarray ? () : 0;
}
Run Code Online (Sandbox Code Playgroud)

  • `我...如果`有未定义的行为. (9认同)
  • [perlsyn](http://p3rl.org/perlsyn):注意:使用语句修饰符条件或循环结构修改my,state或者我们的行为(例如,`my $ x if ...`)未定义.my变量的值可以是undef,任何先前分配的值,或者可能是其他任何值.不要依赖它.perl的未来版本可能会与您尝试使用的perl版本有所不同.这里是龙. (8认同)
  • `my`既有编译时间效果(从下面的语句到块的末尾(或者在另一个声明之后的语句中提到该变量名)绑定到该词法),还有运行时效果(调度值)要清除,并且在退出封闭范围时变量不可用).使其有条件地抑制运行时效果,有时会产生令人惊讶的后果.但这是一个实现细节,可能会发生变化,因此文档中会出现警告. (2认同)