perl - 访问数组数组散列中的元素
perl - access elements in hash of arrays of arrays
我在 perl 中有以下数组数组的散列
$VAR1 = {
'A' => [
[
'1',
'PRESENT_1',
'ABSENT_2',
],
[
'2',
'PRESENT_1',
'ABSENT_2',
]
],
'B' => [
[
'5',
'PRESENT_1',
'ABSENT_2',
],
[
'6',
'PRESENT_1',
'ABSENT_2',
],
[
'7',
'ABSENT_1',
'PRESENT_2',
]
]
};
我想访问每个小数组的第一个元素并将其打印到控制台。
所以输出应该是这样的
EL 1
EL 2
EL 5
EL 6
EL 7
我在遍历数组和取消引用时遇到困难。我是这样开始的,但这显然不是正确的方法
my %hash = %{ $VAR1 };
for my $key (sort keys %hash) {
for my $arr1 (@{ $hash{$key} }){
for my $arr2 (@{ $arr1}) {
print "EL ", @{ $arr2 }[0], "\n";
}
}
}
试试这个:
use strict; use warnings;
use Data::Dumper;
my $VAR1 = {
'A' => [
[
'1',
'PRESENT_1',
'ABSENT_2',
],
[
'2',
'PRESENT_1',
'ABSENT_2',
]
],
'B' => [
[
'5',
'PRESENT_1',
'ABSENT_2',
],
[
'6',
'PRESENT_1',
'ABSENT_2',
],
[
'7',
'ABSENT_1',
'PRESENT_2',
]
]
};
my %hash = %{ $VAR1 };
print Dumper(\%hash);
foreach my $key (sort keys %hash) {
foreach my $inner (@{$hash{$key}}){
print "EL ".@$inner[0]."\n";
}
}
输出:
EL 1
EL 2
EL 5
EL 6
EL 7
快到了。
遍历元素(这也会单独打印出第一个元素)
my %hash = %{ $hashref };
for my $key (sort keys %hash) {
for my $arrayref (@{ $hash{$key} }) {
say "First element: ", $arrayref->[0];
for my $elem (@$arrayref) {
say "element: $elem";
}
}
}
(需要在顶部某处说 use feature qw(say);
,因为 feature say)
所以仅对于第一个元素——如果这确实是您所需要的——根本不需要内部循环
然后,作为练习,单独第一个元素也可以
say $_->[0] for map { @{$hash{$_}} } sort keys %hash;
由于我们是从 arrayrefs 中操作列表,所以让我们提一下 postfix dereferencing,自 v5.20 起可用并在 v5.24 中稳定
use feature qw(postderef);
say $_->[0] for map { $hash{$_}->@* } sort keys %hash;
它在这里并没有给我们带来太多好处,但在这里它的作用一目了然。
我在 perl 中有以下数组数组的散列
$VAR1 = {
'A' => [
[
'1',
'PRESENT_1',
'ABSENT_2',
],
[
'2',
'PRESENT_1',
'ABSENT_2',
]
],
'B' => [
[
'5',
'PRESENT_1',
'ABSENT_2',
],
[
'6',
'PRESENT_1',
'ABSENT_2',
],
[
'7',
'ABSENT_1',
'PRESENT_2',
]
]
};
我想访问每个小数组的第一个元素并将其打印到控制台。
所以输出应该是这样的
EL 1
EL 2
EL 5
EL 6
EL 7
我在遍历数组和取消引用时遇到困难。我是这样开始的,但这显然不是正确的方法
my %hash = %{ $VAR1 };
for my $key (sort keys %hash) {
for my $arr1 (@{ $hash{$key} }){
for my $arr2 (@{ $arr1}) {
print "EL ", @{ $arr2 }[0], "\n";
}
}
}
试试这个:
use strict; use warnings;
use Data::Dumper;
my $VAR1 = {
'A' => [
[
'1',
'PRESENT_1',
'ABSENT_2',
],
[
'2',
'PRESENT_1',
'ABSENT_2',
]
],
'B' => [
[
'5',
'PRESENT_1',
'ABSENT_2',
],
[
'6',
'PRESENT_1',
'ABSENT_2',
],
[
'7',
'ABSENT_1',
'PRESENT_2',
]
]
};
my %hash = %{ $VAR1 };
print Dumper(\%hash);
foreach my $key (sort keys %hash) {
foreach my $inner (@{$hash{$key}}){
print "EL ".@$inner[0]."\n";
}
}
输出:
EL 1
EL 2
EL 5
EL 6
EL 7
快到了。
遍历元素(这也会单独打印出第一个元素)
my %hash = %{ $hashref };
for my $key (sort keys %hash) {
for my $arrayref (@{ $hash{$key} }) {
say "First element: ", $arrayref->[0];
for my $elem (@$arrayref) {
say "element: $elem";
}
}
}
(需要在顶部某处说 use feature qw(say);
,因为 feature say)
所以仅对于第一个元素——如果这确实是您所需要的——根本不需要内部循环
然后,作为练习,单独第一个元素也可以
say $_->[0] for map { @{$hash{$_}} } sort keys %hash;
由于我们是从 arrayrefs 中操作列表,所以让我们提一下 postfix dereferencing,自 v5.20 起可用并在 v5.24 中稳定
use feature qw(postderef);
say $_->[0] for map { $hash{$_}->@* } sort keys %hash;
它在这里并没有给我们带来太多好处,但在这里它的作用一目了然。