2012-04-11 101 views
3

我只是想知道如果我可以得到一些在Perl中取消引用的帮助?Perl - 取消引用哈希

我有一个while循环,我正在查询数据库并迭代我回来的内容。然后,我将我需要的数据写入散列并将散列推入数组中。这些都是JSON字符串的一部分。我只能推散列的引用,而不是散列本身(我试过各种各样的东西),这意味着如果循环进行(例如)3次,我会得到同样的东西出现3次在JSON中,我试图放弃。

下面是代码:

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循环之外)。这意味着只有一个被引用的散列:你将多次引用到同一个散列。我假设你需要一个新的哈希循环的每个迭代。如果是这样,则在循环内声明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

我建议你使用autovivified匿名哈希delared,如FMC解释说,在while循环中。该代码变得更简单那样,成为

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

我不知道怎么样用4个解除引用替换一个引用,以便隐藏一个散列结构(对于代码长度或我能想到的任何其他度量没有好处)是“更简单”的。 – ikegami 2012-04-11 17:56:08