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;

它在这里并没有给我们带来太多好处,但在这里它的作用一目了然。