1

私は2つの配列を持っています:

A、B、C、D、E を含む @Array1

L、B、C、F、E を含む @Array2

foreach を使用して、配列内のすべての要素を調べて、それが真かどうかを開始しようとしましたが、何かを行うと、ダーティで大きな脂肪エラーが発生します。

このプログラムは 1 つの foreach で完全に動作しますが、入れ子になった foreach ではバグが発生します。

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

何か案は; 1つのエラーは次のとおりです。

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

Array::Utilsの array_diff(@arr1, @arr2) を使用することもできます。

于 2012-11-20T01:11:35.767 に答える
1

エラーは、いずれかの配列の値の 1 つが未定義であることを意味します。配列に値がどのように割り当てられているかを示していないため、その理由を知ることはできません。問題が表示されていないコードにあることは明らかです。

問題をデバッグするためにできることは、Data::Dumperモジュールを使用して配列を出力することです。

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

次に、それらに含まれる値を確認する必要があります。

また:

  • else { next }ブロックはループの最後の部分であるため、ブロックを使用する必要はまったくありません。
  • 「それらは等しい」と出力することは、大きな配列に対してはまったく役に立たないステートメントです。なぜなら、何かが他の何かと等しいことを示す出力が得られるからです。ただし、要素の 1 つしかわかりません。
于 2012-11-19T21:03:01.020 に答える
0

TLP が言うように、配列内の値の 1 つが undef です。コードを次のように変更して、問題を解決できます。

    foreach 私の $var (@Array1){
           print "文字 $var \n";
            foreach my $var2 (@Array2){
            #(両方とも undef である (したがって一致する)) OR (両方が定義されて AND MATCH)
            if((!定義済み($var2) && !定義済み($var)) ||
                 (定義済み($var2) && 定義済み( $var) && ($var2 eq $var))) {
                print "それらは等しい\n";
            } そうしないと {
                次;
            }
        }
    }

于 2012-11-19T21:15:41.560 に答える