我有两个数组:
包含A,B,C,D,E 的@Array1
和
包含L,B,C,F,E的@Array2
我尝试使用 foreach 来遍历数组中的每个元素,并说它是否是真的开始,但在做任何事情时我都会遇到肮脏的大胖错误。
该程序可以完美地与一个foreach一起使用,但是对于一个嵌套的foreach,它会出错:
foreach my $var (@Array1){
print "Letter $var";
foreach my $var2 (@Array2){
if($var2 eq $var) {
print "They are equal";
} else {
next;
}
}
}
任何想法;一个错误是:
在第 192 行<>第 2 行 compare.pl 字符串 eq 中使用未初始化的值。
我已经运行了它:
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
您的错误意味着任一数组中的一个值未定义。由于您没有显示数组如何分配值,因此无法说明原因。很明显,问题出在您未显示的代码中。
调试问题可以做的是使用 Data::Dumper
模块打印数组:
use Data::Dumper;
print Dumper @Array1, @Array2;
然后,您应该看到它们包含哪些值。
也:
- 使用
else { next }
块是完全没有必要的,因为它是循环的最后一部分。 - 打印"它们是相等的"对于较大的数组来说将是一个相当无用的陈述,因为你会得到输出,指出某物等于其他东西,但你只知道其中一个元素。
还想使用 array_diff(@arr1, @arr2)数组::实用工具。
正如TLP所说,数组中的一个值是undef。您可以将代码更改为类似的东西来解决问题。
Foreach My $var (@Array1){ 打印"信$var"; foreach my $var 2 (@Array2){ #(两者都是 undef (所以它们匹配)) OR (两者都被定义和匹配) if((!defined($var 2) && !defined($var)) || (定义($var 2) && 定义($var) &&($var 2 eq $var))){ 打印"它们是平等的"; } else { 下一个; } } }