【问题标题】:Hash dereference in PerlPerl 中的哈希解引用
【发布时间】:2012-06-01 07:11:31
【问题描述】:

我有一个 HASH 引用 $job,其中包含以下数据:

{
    "opstat"  : "ok",
    "response": {
                "group_id":23015,
                "order_id":"139370",
                "job_count":"10",
                "credits_used":"100.45",
                "currency":"USD"
                }
}

我想打印“响应”键的哈希值。 我试过这样做,但没有奏效

print %{$job->{'response'}}

编辑

我不想要任何格式。我想知道如何访问“响应”键值中的每个元素。

【问题讨论】:

    标签: perl hash dereference


    【解决方案1】:
    我想知道如何访问 'response' 键值中的每个元素。

    根据定义,您需要某种循环。 foreach 循环是典型的,但您也可以使用 map

    for my $key (keys %{$job->{response}}) {
       my  $val = $job->{response}{$key};
       print("$key: $val\n");  # Or whatever
    }
    

    my $response = $job->{response};
    for my $key (keys %$response) {
       my  $val = $response->{$key};
       print("$key: $val\n");  # Or whatever
    }
    

    【讨论】:

      【解决方案2】:

      试试下面的代码,这是一个真实完整的脚本:

      #!/usr/bin/env perl
      
      use strict;
      use warnings;
      
      my $job = {
          'opstat' => 'ok',
          'response' => {
              'currency' => 'USD',
              'group_id' => ':23015',
              'job_count' => '10',
              'order_id' => '139370',
              'credits_used' => '100.45'
          }
      };
      
      foreach my $key (keys %{$job}) {
          print "key=$key|value=$job->{$key}\n";
      
          # Testing if "$job->{$key}" is a HASH ref
          # ...if yes, we iterate inside the HASH
          #  through the next level.
          if (ref($job->{$key}) eq "HASH") {
              foreach my $key2 (keys %{$job->{$key}}) {
                  print "\tkey=$key2|value=$job->{$key}->{$key2}\n"; 
              }
          }
      }
      

      这是输出:

      key=opstat|value=ok
      key=response|value=HASH(0x1638998)
              key=currency|value=USD
              key=group_id|value=:23015
              key=order_id|value=139370
              key=job_count|value=10
              key=credits_used|value=100.45
      

      如果你想访问“group_id”键:

      print $job->{response}->{group_id};
      

      如果您只想访问“响应”哈希而不进行任何测试:

      foreach my $key (keys %{$job->{response}}) {
          print "key=$key|value=$job->{response}->{$key}\n";
      }
      

      或者用这个while循环和each

      while (my ($key,$value) = each %{$job->{response}}){
          print "key=$key|value=$value\n";
      }
      

      【讨论】:

        【解决方案3】:
        use Data::Dumper;
        
        print Dumper( $job->{response} );
        

        或单独...

        print $job->{response}{group_id};
        

        【讨论】:

          【解决方案4】:

          我不太确定您想要实现什么;您的代码将打印内部哈希的内容而无需任何格式。如果你想要一个格式化的输出,你必须使用Data::Dumper 模块:

          use Data::Dumper;
          my $job = {
            "opstat" => "ok",
            "response" => {
              "group_id":23015,
              "order_id":"139370",
              "job_count":"10",
              "credits_used":"100.45",
              "currency":"USD"
            }
          };
          print Dumper($job->{'response'});
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-28
            • 1970-01-01
            • 1970-01-01
            • 2011-07-26
            • 2017-01-06
            • 2011-10-11
            • 1970-01-01
            相关资源
            最近更新 更多