Perl子例程没有返回任何值

时间:2014-05-15 21:01:57

标签: perl return subroutine

我有一个sub,尽管有一个return语句,但它没有返回任何内容:

 $match = findInArray($$firstArray[$i], $secondArray);

 sub findInArray() {
     my $findThis = $_[0];
     my $findIN = $_[1];
     for (my $i = 0;$i <= $#$findIN;$i++) {
         if (index($findThis, $$findIN[$i]) != -1) {
             $i = 100000;
             return $$findIN[$i];
         }
     }
     return '';
 }

调试窗口不显示var $ match:

   DB<86>
   main::findInArray(ConfCompare:60):                            return $$findIN[$i];
     DB<86> p $$findIN[Si]
   platform/ss7statistics;enableDetailedLinkData;true
     DB<87> n
   main::findDifferencesSclarArrays(ConfCompare:40):
   40:                     if ($match eq ''){
     DB<87> p $match

     DB<88>

2 个答案:

答案 0 :(得分:3)

我猜这个问题是你在返回$i之前因某种原因将$$findIN[$i]设置为100000。 @$findIN很可能没有100001个元素,因此$$findIN[$i]将尝试获取不存在的元素,从而导致函数返回undef

答案 1 :(得分:2)

您对index的使用是倒退的。第一个参数是要在其中搜索的字符串,第二个参数是您要查找的内容。

假设您的匹配有效,通过为$i分配一个不可能的高值,将导致return $$findIN[$i]返回未定义(undef)。

您可能还想考虑将函数重写为更清晰:

sub findInArray {
    my ($findThis, $array) = @_;
    foreach my $element ( @$array ) {
        return $element if index($element, $findThis) != -1;
    }
    return '';
}

这保持了您当前子例程正在执行的操作。如果你不介意查看整个数组,你也可以这样做:

sub findInArray {
    my ($findThis, $array) = @_;
    my ($match) = grep { index($element, $findThis) != -1 } @$array;
    return $match // '';
}