在Perl中,如何遍历YAML加载的哈希数组?
我将以下YAML流加载到Perl的数组中,并希望遍历与Field2关联的数组在Perl中,如何遍历YAML加载的哈希数组?,perl,yaml,Perl,Yaml,我将以下YAML流加载到Perl的数组中,并希望遍历与Field2关联的数组 use YAML; my @arr = Load(<<'...'); --- Field1: F1 Field2: - {Key: v1, Val: v2} - {Key: v3, Val: v4} --- Field1: F2 Field2: - {Key: v5, Val: v6} - {Key: v7, Val: v8} ... foreach (@arr) { @tmp = $_
use YAML;
my @arr = Load(<<'...');
---
Field1: F1
Field2:
- {Key: v1, Val: v2}
- {Key: v3, Val: v4}
---
Field1: F2
Field2:
- {Key: v5, Val: v6}
- {Key: v7, Val: v8}
...
foreach (@arr) {
@tmp = $_->{'Field2'};
print $#tmp; # why it says 0 when I have 2 elements?
# Also why does the below loop not work?
foreach ($_->{'Field2'}) {
print $_->{'Key'} . " -> " $_->{'Val'} . "\n";
}
}
我感谢您的反馈。谢谢。因为您没有正确使用引用。你可能想重读,然后重新阅读
因为您没有正确使用引用。你可能想重读,然后重新阅读
您需要对数据结构和引用进行一些练习。这项工作:
use 5.010;
use strict;
use warnings FATAL => 'all';
use YAML qw(Load);
my @structs = Load(<<'...');
---
Field1: F1
Field2:
- {Key: v1, Val: v2}
- {Key: v3, Val: v4}
---
Field1: F2
Field2:
- {Key: v5, Val: v6}
- {Key: v7, Val: v8}
...
# (
# {
# Field1 => 'F1',
# Field2 => [
# {
# Key => 'v1',
# Val => 'v2'
# },
# {
# Key => 'v3',
# Val => 'v4'
# }
# ]
# },
# {
# Field1 => 'F2',
# Field2 => [
# {
# Key => 'v5',
# Val => 'v6'
# },
# {
# Key => 'v7',
# Val => 'v8'
# }
# ]
# }
# )
foreach (@structs) {
my $f2_aref = $_->{'Field2'};
print scalar @{ $f2_aref }; # 2
foreach (@{ $f2_aref }) {
say sprintf '%s -> %s', $_->{'Key'}, $_->{'Val'};
}
# v1 -> v2
# v3 -> v4
# v5 -> v6
# v7 -> v8
}
您需要对数据结构和引用进行一些练习。这项工作:
use 5.010;
use strict;
use warnings FATAL => 'all';
use YAML qw(Load);
my @structs = Load(<<'...');
---
Field1: F1
Field2:
- {Key: v1, Val: v2}
- {Key: v3, Val: v4}
---
Field1: F2
Field2:
- {Key: v5, Val: v6}
- {Key: v7, Val: v8}
...
# (
# {
# Field1 => 'F1',
# Field2 => [
# {
# Key => 'v1',
# Val => 'v2'
# },
# {
# Key => 'v3',
# Val => 'v4'
# }
# ]
# },
# {
# Field1 => 'F2',
# Field2 => [
# {
# Key => 'v5',
# Val => 'v6'
# },
# {
# Key => 'v7',
# Val => 'v8'
# }
# ]
# }
# )
foreach (@structs) {
my $f2_aref = $_->{'Field2'};
print scalar @{ $f2_aref }; # 2
foreach (@{ $f2_aref }) {
say sprintf '%s -> %s', $_->{'Key'}, $_->{'Val'};
}
# v1 -> v2
# v3 -> v4
# v5 -> v6
# v7 -> v8
}
为什么使用sprintf而不是字符串插值?此外,此代码不会运行。您需要使用特性pragma或use 5.12;在这种情况下,你不需要严格的使用;不再使用say函数了。@Chas。欧文斯:我想你的意思是使用5.012;sprintf通常比插值更清晰,因为它是一种更好的风格。有些引用不容易插值,也就是说,是的,我知道ref-deref技巧,当sprintf、oth这样的构造总是有效时,我可以决定是否使用它我添加了use 5.010;。现在请取消你的否决票。@daxim我没有否决你。我通常不会投反对票;在过去一年半里,我只投了19次反对票。在我看来,你所做的一切都不值得投反对票,我把他们留给危险或坏的建议。我发现插值不起作用的唯一一次是当你调用一个方法时,这并不奇怪,因为函数不插值,你有没有任何例子说明解引用不会插值?老实说,我想不出会发生这种情况。@drewk,谁使用Perl的系统版本?那东西有毒。我也使用OSX,运行的是5.12。看一看。管理自定义构建非常简单。当我说我在运行5.12时,我的意思是我在运行5.10.1、5.12.1和5.13.4,所有这些都是由perlbrew管理的,但我使用的最多的是5.12。为什么使用sprintf而不是字符串插值?此外,此代码不会运行。您需要使用特性pragma或use 5.12;在这种情况下,你不需要严格的使用;不再使用say函数了。@Chas。欧文斯:我想你的意思是使用5.012;sprintf通常比插值更清晰,因为它是一种更好的风格。有些引用不容易插值,也就是说,是的,我知道ref-deref技巧,当sprintf、oth这样的构造总是有效时,我可以决定是否使用它我添加了use 5.010;。现在请取消你的否决票。@daxim我没有否决你。我通常不会投反对票;在过去一年半里,我只投了19次反对票。在我看来,你所做的一切都不值得投反对票,我把他们留给危险或坏的建议。我发现插值不起作用的唯一一次是当你调用一个方法时,这并不奇怪,因为函数不插值,你有没有任何例子说明解引用不会插值?老实说,我想不出会发生这种情况。@drewk,谁使用Perl的系统版本?那东西有毒。我也使用OSX,运行的是5.12。看一看。管理自定义构建非常简单。当我说我在运行5.12时,我的意思是我在运行5.10.1、5.12.1和5.13.4,所有这些都是由perlbrew管理的,但我使用的最多的是5.12。您没有提到Martin询问Field2键的hashref值计数的部分。@daxim链接解决了该部分以及与引用相关的其他问题。您没有提到Martin询问Field2键的hashref值计数的部分。@daxim链接解决了该部分和其他部分与参考文献有关的问题。