perl - 访问数组数组散列中的元素

问题描述

我在 perl 中有以下数组数组的散列

$VAR1 = {
      'A' => [
                   [
                     '1','PRESENT_1','ABSENT_2',],[
                     '2',]
                 ],'B' => [
                  [
                    '5',[
                    '6',[
                    '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',]
                 ],'B' => [
                  [
                    '5',[
                    '6',[
                    '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;

它在这里没有给我们带来太多好处,但在这里它的作用很明显。