首页 文章

逐个字符perl比较两个数组

提问于
浏览
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 回答

  • 0

    我跑了:

    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

    正如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;
                }
            }
        }
    
  • 2

    您的错误意味着任何一个数组中的值之一是未定义的 . 由于您没有显示如何为数组赋值,因此无法确定原因 . 很明显,问题出在你没有展示的代码中 .

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

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

    然后你应该看到它们包含的值 .

    也:

    • 使用 else { next } 块是非常必要的,因为它是循环的最后一部分 .

    • 打印"They are equal"对于更大的数组来说是一个非常无用的语句,因为你会得到输出,表明某些东西等于其他东西,但你只会知道其中一个元素 .

  • 1

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

相关问题