改变"的行为,如果"在perl中声明一点点

时间:2014-09-03 02:43:31

标签: arrays perl

我继承了许多代码,如下所示

if (func1()) { .... }

" func1()"可以返回标量,数组或对数组的引用。我想评估" if"在上面如下:

  • 当func1()返回一个数组时,如果数组中至少有一个元素,则该值应该为true
  • 当func1()返回对数组的引用时,如果引用的数组中至少有一个元素,则它应该为true。
  • 当func1()返回一个标量时,只需将其评估为正常

我知道我可以做以下的事情

@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。

1 个答案:

答案 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返回一个不是参考的真值时会发出警告。)