逐个字符perl比较两个数组

时间:2012-11-19 20:56:23

标签: arrays string perl compare character

我有两个数组:

@ 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行<>中使用字符串eq中未初始化的值第2行。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

然后您应该看到它们包含的值。

此外:

  • 使用else { next }块是非常必要的,因为它是循环的最后一部分。
  • 打印“它们是相同的”对于更大的数组来说是一个非常无用的声明,因为你会得到输出,表明某些东西等于其他东西,但你只会知道其中一个元素。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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


    foreach my $var (@Array1){
           print "Letter $var \n";
            foreach my $var2 (@Array2){
            #(Both are undef (so they match)) OR (both are defined AND MATCH)
            if((!defined($var2) && !defined($var)) || 
                 (defined($var2) && defined( $var) && ($var2 eq $var))) {
                print "They are equal\n";
            } else {
                next;
            }
        }
    }