3

我只是想知道是否可以在 Perl 中获得一些关于取消引用的帮助?

我有一个 while 循环,我在其中查询数据库并迭代我返回的内容。然后我将我需要的数据写入哈希并将哈希推送到数组中。这都是 JSON 字符串的一部分。

但是,我只能推送对哈希的引用,而不是哈希本身(我已经尝试了各种方法),这意味着如果循环进行(例如)3 次,我会在 JSON I 中得到相同的东西出现 3 次我正在尝试放置。

这是代码:

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;

谢谢你的帮助!

4

2 回答 2

6

您推送到数组的哈希 ref 的范围在外层(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);
于 2012-04-11T14:42:22.180 回答
1

正如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;
于 2012-04-11T15:03:34.317 回答