1

我有两个数组:

@Array1 包含 A、B、C、D、E

@Array2 包含 L、B、C、F、E

我尝试使用 foreach 遍历数组中的每个元素并说出它是否正确开始,但是在做任何事情时我都会遇到严重的大错误。

该程序与一个 foreach 完美配合,但使用嵌套的一个它会出错:

foreach my $var (@Array1){
       print "Letter $var";
        foreach my $var2 (@Array2){
        if($var2 eq $var) {
            print "They are equal";
        } else {
            next;
        }
    }
}

有任何想法吗; 一个错误是:

在 compare.pl 第 192 行,<> 第 2 行的字符串 eq 中使用未初始化的值。

4

4 回答 4

2

我已经运行了它:

use strict;
use warnings;

my @Array1=qw/A B C D E/;
my @Array2=qw/L B C F E/;

foreach my $var (@Array1){
       $\=$/;
       print "Letter $var";
        foreach my $var2 (@Array2){
        if($var2 eq $var) {
            print "They are equal";
        } else {
            next;
        }
    }
}

我明白了

Letter A
Letter B
They are equal
Letter C
They are equal
Letter D
Letter E
They are equal
于 2012-11-19T21:11:22.247 回答
1

您的错误意味着任一数组中的一个值未定义。由于您没有显示如何为数组分配值,因此无法说明原因。很明显,问题在于您没有显示的代码。

调试问题的方法是使用模块打印数组Data::Dumper

use Data::Dumper;
print Dumper \@Array1, \@Array2;

然后你应该看到它们包含什么值。

还:

  • 完全没有必要使用你的else { next }块,因为它是循环的最后一部分。
  • 对于较大的数组,打印“它们相等”将是一个非常无用的语句,因为您会得到表明某事物等于其他事物的输出,但您只会知道其中一个元素。
于 2012-11-19T21:03:01.020 回答
1

您可能还想使用Array::Utils的 array_diff(@arr1, @arr2) 。

于 2012-11-20T01:11:35.767 回答
0

正如 TLP 所说,数组中的一个值是 undef。您可以将代码更改为类似的内容来解决问题。

    foreach 我的 $var (@Array1){
           print "字母 $var \n";
            foreach 我的 $var2 (@Array2){
            #(两者都是 undef(因此它们匹配))或(两者都已定义 AND MATCH)
            if((!defined($var2) && !defined($var)) ||
                 (定义($var2) && 定义($var) && ($var2 eq $var))) {
                print "他们相等\n";
            } 别的 {
                下一个;
            }
        }
    }

于 2012-11-19T21:15:41.560 回答