【问题标题】:Perl - De- Referencing a HashPerl - 取消引用哈希
【发布时间】:2012-04-11 14:24:55
【问题描述】:

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

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

但是,我只能推送对哈希的引用而不是哈希本身(我已经尝试了各种方法),这意味着如果循环(例如)3 次,我会得到相同的东西出现 3 次我正在尝试 PUT 的 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;

感谢您的帮助!

【问题讨论】:

    标签: json perl


    【解决方案1】:

    您推送到数组的散列引用的范围在外层(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);
    

    【讨论】:

      【解决方案2】:

      我建议你在while 循环中使用一个 autovivified 匿名哈希,正如 FMc 解释的那样。这样代码就变得更简单了,变成了

      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;
      

      【讨论】:

      • 我不确定如何用 4 个取消引用替换一个引用以隐藏哈希构造(对于代码长度或我能想到的任何其他指标没有好处)是“更简单”的。跨度>
      猜你喜欢
      • 2011-10-11
      • 2018-02-25
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2012-05-28
      相关资源
      最近更新 更多