2017-10-11 14 views
-2

問題が残っています。私は2つのハッシュの参照を作成しようとしているし、サブルーチンでそれらを比較します。しかし、エラーがあります:サブルーチンにハッシュリファレンスを渡す方法

compareHashes.plラインでHASHリファレンスとして未定義の値を使用することはできません10.

私のコードは次のとおりです。

use strict; 
use warnings; 
use feature qw(say); 

my $hash_1; my $hash_2; 
compareHashes($hash_1, $hash_2); 

sub compareHashes{ 
    say "the first hash:", "\n", %$hash_1; 
    say "the second hash:", "\n", %$hash_2; 
    if ((keys(%$hash_1) eq keys(%$hash_2)) and (values(%$hash_1) eq values(%$hash_2))){ 
     say "Two above hashes are equal";} 
    else { 
     say "Two above hashes are not equal"; 
    } 
}; 

my %hash1 = (ITALY => "ROME", 
     FRANCE => "PARIS" 
     ); 
my %hash2 = (ITALY => "MILAN", 
     FRANCE => "PARIS" 
     ); 
my %hash3 = (ITALY => "ROME"); 
my %hash4 = (SPAIN => "ROME", 
     FRANCE => "PARIS" 
     ); 
my $hash1_r = \%hash1; 
my $hash2_r = \%hash2; 
my $hash3_r = \%hash3; 
my $hash4_r = \%hash4; 

compareHashes ($hash1_r, $hash1_r); 
compareHashes ($hash1_r, $hash2_r); 
compareHashes ($hash1_r, $hash3_r); 
compareHashes ($hash1_r, $hash4_r); 

何が間違っているを教えてください。私はあなたの助けに感謝します。

+1

$ hash_1または$ hash_2に値を割り当てなかったため、未定義ですか? –

+0

多分私はsayを定義します。印刷物を使用してみてください。 –

+0

はい。私は4つの "本当の"ハッシュを比較しようとしています。 –

答えて

5

$hash_1$hash_2には一度も割り当てられませんでした。

my ($hash_1, $hash_2) = @_; 

は、あなたがより多くの問題を抱えている、しかし、両方keysvaluesスカラコンテキストであなたは、単に両方のハッシュが同じサイズのものであるかどうかをチェックしているので、ハッシュの要素数を返します!

sub are_hashes_equal { 
    my ($hash1, $hash2) = @_; 

    { 
     my %set; 
     ++$set{$_} for keys(%$hash1); 
     --$set{$_} for keys(%$hash2); 
     return 0 if grep { $_ } values(%set); 
    } 

    for my $key (keys(%$hash1)) { 
     return 0 if $hash1->{$key} ne $hash2->{$key}; 
    } 

    return 1; 
} 
関連する問題