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

如何在perl中返回长度为0的空数组/数组?,perl,Perl,我想返回一个空数组,而不是一个空列表 我有一个sub,它返回一个数组。我希望能够用它做到这一点: my $count = scalar getArray(); 我是这样做的: sub getArray { if ( !isGood() ) { return (); } else { my @array = calculateSomehow(); return @array; } } my $count = scalar g

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

我有一个sub,它返回一个数组。我希望能够用它做到这一点:

my $count = scalar getArray();
我是这样做的:

sub getArray {
    if ( !isGood() ) {
        return ();
    } else {
        my @array = calculateSomehow();
        return @array;
    }
}
my $count = scalar getArray();
当我看到
时,我大吃一惊!isGood()
$count
变为
undef
,而不是
0
!阅读后,我意识到这是因为getArray()是在标量上下文中计算的,因此列表
()
是作为标量计算的,而
标量(())
undef
,而
my@array;标量(@array)
为0

现在的问题是:如何最优雅地返回空数组,以便
$count
0
如果
!isGood()
?我只想到:

# This is kind of kludgy: Dereference an anonymous array ref. Really?
return @{[]};


返回长度为0的数组(空数组)或使
scalar getArray()
求值为
0

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

sub getArray {
    my @array;
    @array = calculateSomehow() if isGood();
    return @array;
}
但要以最小的方式修改原始代码,请使用
wantarray

if (!isGood()) {
    return wantarray ? () : 0;
}

返回一个引用,通过取消引用,您可以在一次调用中获得数组大小(如果为空,则为0)

sub getArray {
    # calculate ...
    return [ @results ];      # @results may be empty
}

$rres = getArray();
my $count = @$rres;           # gives 0 if ref is to empty array

my $cnt   = @{ getArray() };  # or without storing the return
如果愿意,可以使用上面的
标量
,但不需要。这也类似于返回指向数组的指针(即使是空的),如果这是您通过要求“空数组”而想到的

如果您想走这条路线,但要挑出
不好的

sub getArray {
    return if !isGood();  # returns undef
    # calculate ...
    return [ @results ];  # scalar whether the list be empty or not
}

使用
context
可能会有所帮助——您可以获取数组(空列表或非空列表),或者获取标量的
0

sub getArray {
   if (!isGood() ) {
       return (wantarray) ? () : 0;
   }
   else { }  # your code
}
my @results = getArray() # returns a list, possibly empty
my $count = getArray();  # returns 0

你觉得我的@empty
更干净还是更优雅?谢谢@choroba-是的,我觉得!SUB总是返回列表。正如@ysth正确观察到的,您不能从子例程返回数组,只能返回列表。数组的计算结果为列表上下文中的列表和标量上下文中的标量。谢谢,@tchrist。如果你把这个作为一个答案,我会接受的。这就解释了到底发生了什么。对不起,zdim,@Sean抢先了你一步!;-)@彼得·莫奇,我看到了。。。到了17秒?结果是,通过他需要的(简单的)纠正。。。他没有
我的。。。如果
有未定义的行为。@choroba如果是真的,那会让我大吃一惊。请提供参考。:注意:my、state或our modified with语句修饰符条件或循环构造(例如,
my$x if…
)的行为未定义。my变量的值可能是未定义的、任何先前指定的值,或者可能是任何其他值。不要依赖它。未来版本的perl可能会做一些与您试用的perl版本不同的事情。这里有龙,嗯。似乎我在很多地方都见过这样的代码,这里的语义似乎很明确。但是修复起来很容易。
my
既有编译时效果(从下面的语句到块的末尾(或在另一个声明之后的语句)提到变量名绑定到该词法),也有运行时效果(将要清除的值和退出封闭范围时不可用的变量安排为有条件)。将其设置为有条件会抑制运行时效果,有时会产生令人惊讶的后果。但这是一个实现细节,可能会发生更改,因此会在文档中发出警告。
sub getArray {
   if (!isGood() ) {
       return (wantarray) ? () : 0;
   }
   else { }  # your code
}
my @results = getArray() # returns a list, possibly empty
my $count = getArray();  # returns 0