在Perl中,如何遍历YAML加载的哈希数组?

在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 = $_

我将以下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 = $_->{'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链接解决了该部分和其他部分与参考文献有关的问题。