【问题标题】:perl - access elements in hash of arrays of arraysperl - 访问数组数组哈希中的元素
【发布时间】:2021-08-01 23:51:43
【问题描述】:

我在 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";
       }
    }
}

【问题讨论】:

  • perldsc 页面(Perl Data Structures Cookbook)有很多例子。

标签: arrays perl data-structures


【解决方案1】:

已经很接近了。

遍历元素(这也单独打印出第一个元素)

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);,对于featuresay

因此,仅对于第一个元素——如果这确实是你所需要的——根本不需要内部循环


那么,只是作为一个练习,对于第一个元素也可以做

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;

它在这里并没有给我们带来太多好处,但在这里再次清楚它的作用。

【讨论】:

    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 2016-12-12
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      相关资源
      最近更新 更多