Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在perl中迭代散列_Json_Perl_Hash - Fatal编程技术网

Json 在perl中迭代散列

Json 在perl中迭代散列,json,perl,hash,Json,Perl,Hash,我使用了:打印转储程序$decoded,其中$decoded是散列变量,我将其作为输出 $VAR1 = { 'Case_345' => { 'Notes' => 'test2', 'Submit_Date' => '2015-11-21 00:53:22 UTC',

我使用了:
打印转储程序$decoded
,其中
$decoded
是散列变量,我将其作为输出

    $VAR1 = {
              'Case_345' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   },
              'Case_512' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   },
              'Case_534' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   },
              'Case_552' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   },
              'Case_578' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   },
              'Case_466' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   },
              'Case_754' => {
                                     'Notes' => 'test2',
                                     'Submit_Date' => '2015-11-21 00:53:22 UTC',
                                     'Last_Resolved_Date' => ''
                                   }
            };
这就是我试图用来输出一些值来测试遍历散列的方法

    foreach my $key ( keys %decoded )
    {
         print "key: $key, value: $decoded{$key}\n";
    }

它根本不通过
$decoded
变量进行迭代。我是perl新手,有人能帮我一下吗。如果有帮助的话,我可以通过使用
JSON::XS::decode_JSON($JSON_str)
转换字符串来实现这一点。谢谢。

首先,
$decoded
是一个包含哈希引用的标量变量,与哈希变量
%decoded
无关。要访问
$decoded
引用的哈希,必须使用
%$decoded

您必须始终在编写的每个Perl程序的顶部使用strict和warning'all',尤其是在请求他人帮助之前。在本例中,这是一个简单的度量方法,可以捕捉到您使用了
%decoded
,而没有声明它的事实

此外,散列的值更多的是散列引用,打印出来会产生一些不太有用的东西

key: Case_466, value: HASH(0xbf4840)
key: Case_534, value: HASH(0xc6dc00)
key: Case_552, value: HASH(0x280fce0)
key: Case_512, value: HASH(0xbf4930)
key: Case_345, value: HASH(0xd4c2f0)
key: Case_754, value: HASH(0x280fdd0)
key: Case_578, value: HASH(0x280fd58)
假设您想要每个散列中所有字段的值?要访问给定键和哈希引用的哈希元素的值,您应该编写
$hashref->{key}
,以便此代码为您转储整个哈希

for my $key ( keys %$decoded ) {
  my $data = $decoded->{$key};
  print "key: $key, values:\n";
  for my $field ( qw/ Submit_Date Last_Resolved_Date Notes / ) {
    printf "    %-18s => %s\n", $field, $data->{$field};
  }
}
输出
key:Case_578,值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2
关键词:案例_754,数值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2
关键字:案例_534,值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2
关键词:案例345,数值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2
键:Case_512,值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2
键:Case_552,值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2
关键字:Case_466,值:
提交日期=>2015-11-21 00:53:22 UTC
上次解决日期=>
Notes=>test2

首先,正如Borodin所说,
$decoded
不是散列变量。它是一个标量变量;它恰好包含对匿名哈希的引用。在Perl中,每个符号都有自己的名称空间,因此标量变量
$decoded
和哈希变量
%decoded
(或者数组变量
@decoded
)之间没有关系。如果您在
use strict下运行,则使用未定义的hash变量将被标记为错误;一般来说,在开始Perl脚本时应始终使用
use strict。使用
use warnings打开警告是个好主意也是

人们普遍认为
使用严格的设计错误。它在5.12版中是默认的,但是为了向后兼容,它仍然只在声明它们是为新的Perl编写的脚本中启用。因此,作为
的替代方案,使用strict
,您可以将
放在v5.12中使用
(或更新的版本号),这也将使其他(非实验性的)新功能,如
可以使用换行符打印

其次,在Perl中迭代散列的键和值的标准方法是使用
每个
,您可以对外部散列和每个散列执行此操作:

while (my ($case, $data) = each %$decoded) {
  print "$case:\n";
  while (my ($field, $value) = each %$data) {
    print "\t$field: $value\n";
  }
}
但在实践中,
每一个
通常都是避免的,因为它不会以任何可预测的顺序在键上迭代(尽管
返回结果的顺序相同)。您可能更喜欢对键进行排序并手动查找值:

foreach my $case (sort keys %$decoded) {
  my $data = $decoded->{$case};     
  print "$case:\n";
  foreach my $field (sort keys %$data) {
    $value = $data->{$field};
    print "\t$field: $value\n";
  }
}
此外,输出可能更人性化,使用空格而不是下划线:

foreach my $case (sort keys %$decoded) {
  my $data = $decoded->{$case};␣␣␣␣␣
  (my $case_label = $case) =~ s/_/ /g;
  print "$case_label:\n";
  foreach my $field (sort keys %$data) {
    (my $field_label = $field) =~ s/_/ /g;
    $value = $data->{$field};
    print "\t$field_label: $value\n";
  }
}
这就产生了:

Case 345:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC
Case 466:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC
Case 512:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC
Case 534:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC
Case 552:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC
Case 578:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC
Case 754:
    Last Resolved Date: 
    Notes: test2
    Submit Date: 2015-11-21 00:53:22 UTC

在Perl中迭代散列的键和值的通常方法是使用它们。太容易出错。//没有提到限制???增加了限制,但仍然不确定每个限制如何“容易出错”?每个哈希只有一个/key/values迭代器。过早退出循环不会导致问题[常见]。调用同时在同一散列上进行迭代的子对象会导致问题[罕见]<代码>每个
因此很少使用。这远远不是标准。请阅读,尤其是关于。