2017-10-25 14 views
-1

私はサブルーチンに渡しているハッシュを持っています。空のハッシュもサブルーチンに渡します。私は空のものにハッシュの内容をコピーしたいと思います。ここでPerlはスカラーをハッシュにコピーします

は私のコードがどのように見えるかです:

my %emptyHash =(); 
my %sourceHash =(); 
$sourceHash{'apple'} = 'red'; 
$sourceHash{'orange'} = 'orange'; 

mergeHash(\%emptyHash, \%sourceHash); 

foreach my $k (keys %emptyHash) 
{ 
    print "key=>". $k. "value=>".$emptyHash{$k}. "\n"; 
} 

sub mergeHash { 
    my $emptyHash = shift; 
    my $sourceHash = shift; 

    $emptyHash = $sourceHash; 

} 

私は、マージ後emptyHashを印刷するとき、私はまだ空のハッシュを取得します。 1つのハッシュの値をこのように別のものにコピーできないのですか?

答えて

4

$emptyhashおよび$sourcehashは、の参照である。 $emptyhash = $sourcehashを実行すると、変数$emptyhashには$sourcehashと同じ参照が含まれます。

代わりに、%$emptyhash = %$sourcehashが必要です。これは、ハッシュにそれらの参照が作用するようにします。ポイントです。

1

クイックコピーや深いコピーをしたいですか?クイックコピーは、ハッシュのトップレベルのスカラーだけをコピーします。ハッシュに匿名の配列やハッシュが含まれている場合、それらはコピーされません。代わりに、それらへの参照が行われます。つまり、それらの内部の変更がコピーされたハッシュで同じ変更を引き起こすことを意味します。

クイックコピー:

%$empty_hash = %$source_hash; 

ディープコピーは:

use Storable qw(dclone); 
$empty_hash = declone($source_hash); 

Storableは、Perlに付属している標準モジュールです。標準モジュールのリストについては、perldoc perlmodlibを参照してください。

0

以下にコードを修正しました。

my %emptyHash =(); 
my %sourceHash =(); 
$sourceHash{'apple'} = 'red'; 
$sourceHash{'orange'} = 'orange'; 

my $d = mergeHash(\%emptyHash, \%sourceHash); 

foreach my $k (keys %$d) 
{ 
    print "key=>". $k. "\tvalue=>". $emptyHash{$k}. "\n"; 
} 

sub mergeHash { 
    my $emptyHash = shift; 
    my $sourceHash = shift; 

    %$emptyHash = %$sourceHash; 
    return $emptyHash; 
} 
+0

mergeHash関数の$ emptyHashは、mergeHash関数でのみ使用できます。 $ emptyHashがメイン関数で使用されている場合、$ emptyHashは異なります。したがって、mergeHash関数は$ mergeHashで$ emptyHashを返す必要があります。他の変数に値を代入する必要があります。その後、その変数を使用することができます。 –

+0

さらに、Data :: Dumperモジュールを使用して簡単にデバッグすることができます。 –

関連する問題