2012-04-11 10 views
3

私はPerlで逆参照について助けを得ることができますか?Perl - ハッシュの参照を外す

私はDBにクエリを実行していて、何を返すのかを反復するwhileループを持っています。次に、必要なデータをハッシュに書き込み、ハッシュを配列にプッシュします。これはすべてJSON文字列の一部です。

しかし、私はハッシュ自体ではなくハッシュ自体を参照することができます(私はあらゆる種類のものを試しました)。つまり、ループが3回行われた場合、同じことが3回表示されます私はJSONでPUTしようとしています。ここで

は、コードは次のとおりです。任意のヘルプ

my $json = new JSON::XS; 
my $json_text = JSON::XS->new->decode (shift->content); 
my $sig_num = 0; 
my %sig_hash; 
<MySQL Stuff -removed for readability> 

while($query_handle->fetch()) 
    { 
    $sig_num++; 
    $sig_hash{position} = 'below'; 
    $sig_hash{signature_text} = $sig; 
    $sig_hash{signature_name} = 'Signature '.$sig_num; 
    $sig_hash{signature_default} = JSON::XS::true; 
    push (@{$json_text->{data}->{mail}->{signatures}}, \%sig_hash); 
    } 
return $json_text; 

ありがとう!

答えて

6

配列にプッシュしているハッシュリファレンスは、外側のレベル(whileループの外側)でスコープされています。これは、参照されるハッシュが1つだけであることを意味します。同じハッシュへの参照を複数回配列にプッシュしています。私はあなたがループの各反復のために新鮮なハッシュを望むと仮定します。その場合は、my %sig_hashを外側ではなくループの内側に宣言します。

このスクリプトを試して違いを確認できます。まずそれをそのまま実行します。ループの外にmy %hを移動し、再度実行します。

my @data; 

for (1..3){ 
    my %h;    # New hash for each iteration of the loop. 
    $h{a} = 10 * $_; 
    $h{b} = 20 * $_; 
    push @data, \%h; 
} 

use Data::Dumper; 
print Dumper(\@data); 
1

私はあなたがはFMCがwhileループ内で、説明しているよう無名ハッシュは、delared自動活性化使用をお勧めします。コードはそのように簡単になり、そして

my $json = new JSON::XS; 
my $json_text = JSON::XS->new->decode(shift->content); 
my $sig_num = 0; 

while ($query_handle->fetch) { 
    my $sig_hash; 
    $sig_hash->{position} = 'below'; 
    $sig_hash->{signature_text} = $sig; 
    $sig_hash->{signature_name} = "Signature ".++$sig_num; 
    $sig_hash->{signature_default} = JSON::XS::true; 
    push @{$json_text->{data}{mail}{signatures}}, $sig_hash; 
} 

return $json_text; 

になったか、あなたが構築し、私はどのようにわからない変数

my $json = new JSON::XS; 
my $json_text = JSON::XS->new->decode(shift->content); 
my $sig_num = 0; 

while ($query_handle->fetch) { 
    push @{$json_text->{data}{mail}{signatures}}, { 
    position => 'below', 
    signature_text => $sig, 
    signature_name => "Signature ".++$sig_num, 
    signature_default => JSON::XS::true, 
    }; 
} 

return $json_text; 
+0

にそれを割り当てずに、スタック上に直接無名ハッシュをプッシュすることができます好む場合ハッシュ構造を隠すために1つのリファレンスを4つの逆参照で置き換える(コード長や他のメトリックでは役に立たない)ことは "より簡単"です。 – ikegami

関連する問題