2

私はperlのコードの一部を理解しようとしていますが、それがperlプログラミングにとって新しいものであることに問題があります。

2つのハッシュがあり、forループの異なる反復で同じ(キー、値)ペアが同じ順序で入力されています。

反復1は%hash1を作成し、反復2は%hash2を作成します。

%hash1 = (1 => 10, 2 => 20, 3=> 30);

%hash2 = (1 => 10,  2 => 20, 3=> 30);

次に、これらを比較するコマンドは次のようになります。

if (%hash1 ne %hash2) {print "Not Equal"; die;}

私の質問は:

(1)上記のifステートメントで正確に比較されるものは何ですか?

(2)割り当ててみましたが

my $a = %hash1; my $b = %hash2;

しかし、これらは私に3/8のような出力を与えます!それは何でしょうか?

どんな助けでも大歓迎です。

4

2 に答える 2

10

ne文字列比較演算子です。オペランドは文字列であるため、スカラーです。perldataから、

スカラーコンテキストでハッシュを評価する場合、ハッシュが空の場合はfalseを返します。キーと値のペアがある場合は、trueを返します。より正確には、返される値は、使用されたバケットの数と割り当てられたバケットの数で構成され、スラッシュで区切られた文字列です。

したがって、両方のハッシュに同じ数の使用済みバケットがあり、両方のハッシュに同じ数の割り当てられたバケットがあることを比較しています。

ハッシュを比較する1つの方法は、JSON:XScanonicalsetを使用してハッシュを文字列化することです。

JSON::XS->new->canonical(1)->encode(\%hash)
于 2012-06-27T21:01:04.430 に答える
0

CPANのハッシュを比較するために利用できるModuleData ::Compareがあります。これは次のように機能します。

 use Data::Compare; # exports subroutine: Compare() !
 ...

 my %hash1 = (1 => 10, 2 => 20, 3 => 30);
 my %hash2 = (1 => 10, 2 => 20, 3 => 30);

 # This won't work:
 # if (%hash1 ne %hash2) {print "Not Equal"; die;}

 # This works:
 if( ! Compare(\%hash1, \%hash2)  ) {  print "Not Equal";  die; }

 ...

これはコアモジュールではないため、インストールする必要があります。また、activeperl / windows(デフォルトのリポジトリ内)でも利用できます。

よろしく、

rbo

于 2012-06-28T08:44:47.813 に答える