我继承了许多代码,如下所示
if (func1()) { .... }
" func1()"可以返回标量,数组或对数组的引用。我想评估" if"在上面如下:
我知道我可以做以下的事情
@a = func1();
if (!defined $a[0]) {
#false
} elsif (ref($a[0] eq "ARRAY") {
if (scalar(@{$a[0]})) {
#true
} else {
#false
}
} elsif ($a[0]) {
#true
} else {
#false
}
但这很繁琐,if (func1())...
出现了很多这样的事情。想知道是否有一种简单的方法来制作perl"如果"陈述表现得像我想要的那样。
提前致谢。
更新:
感谢@ikegami的问题,我意识到我的真正问题如下(请参阅以下评论,转载此处以便于阅读)
funcX()
将返回对列表的引用。 if
的当前行为是,无论引用的列表是否为空,它总是会被评估为真。但是如果引用的列表为空,我希望if (funcX())
评估为false,否则为true。
答案 0 :(得分:2)
sub check($) {
return undef if !$_[0];
return undef if ( ref($_[0]) || '' ) eq 'ARRAY' && !@{ $_[0] };
return 1;
}
if (check(func1()) {
...
}
与原始代码一样(与您所说的相反),func1
必须返回标量。如果标量为假,则check
返回false;如果标量是对空数组的引用,则返回false,否则返回true。 (就像你过于复杂的检查没有编译一样,当func1
返回一个不是参考的真值时会发出警告。)