1

このコードを見てください。何時間もの試行錯誤の後。私は最終的に解決策を得ました。しかし、それが機能する理由がわかりません。正直に言うと、Perl はここでループに陥っています。

use Data::Diff 'Diff';
use Data::Dumper;

my $out = Diff(\@comparr,\@grabarr);

my @uniq_a;

@temp = ();
my $x = @$out{uniq_a};
foreach my $y (@$x) {
    @temp = ();
    foreach my $z (@$y) {
        push(@temp, $z);
    }
    push(@uniq_a, [$temp[0], $temp[1], $temp[2], $temp[3]]);
}

$out 配列の要素にアクセスできる唯一の方法は、for ループを使用して配列としてキャストされたスカラーにハッシュ キーを渡すことであるのはなぜですか? my $x = @$out{uniq_a};私は完全に混乱しています。ここで何が起こっているのかを説明できる人には本当に感謝しているので、将来のために知っておきます. 前もって感謝します。

4

3 に答える 3

4

$outはハッシュ参照であり、逆参照演算子を使用して、参照->{...}するハッシュのメンバーにアクセスします。

$out->{uniq_a}

あなたがつまずいたのは、Perl のハッシュ スライス表記です。@ハッシュの名前の前にシジルを使用して、そのハッシュから値のリストを便利に抽出します。例えば:

%foo = ( a => 123, b => 456, c => 789 );
$foo = { a => 123, b => 456, c => 789 };
print @foo{"b","c"};    # 456,789
print @$foo{"c","a"};   # 789,123

中括弧内の単一の要素でハッシュ スライス表記を使用するのは一般的な使用法ではなく、意図した結果が偶然得られます。

于 2013-01-10T20:04:35.873 に答える
2

このDiff関数はハッシュ参照を返します。uniq_a正しい$out->{uniq_a}. _ コードは次のようになります

my $out = Diff(\@comparr, \@grabarr);

my @uniq_a;
my $uniq_a = $out->{uniq_a};
for my $list (@$uniq_a) {
  my @temp = @$list;
  push @uniq_a, [ @temp[0..3] ];
}
于 2013-01-10T20:06:26.123 に答える
1

ドキュメントには次のように記載されData::Diffています。

返される値は常にハッシュ参照であり、ハッシュには次のハッシュ キーの 1 つ以上が含まれます: type、same、diff、diff_a、diff_b、uniq_a、および uniq_b

参照$outも同様であり、前述のキーを介して値にアクセスする必要があります。

于 2013-01-10T20:02:11.913 に答える