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打开警告是个好主意代码>也是
人们普遍认为使用严格的设计错误在Perl 5中,默认情况下不启用code>。它在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迭代器。过早退出循环不会导致问题[常见]。调用同时在同一散列上进行迭代的子对象会导致问题[罕见]<代码>每个
因此很少使用。这远远不是标准。请阅读,尤其是关于。