首页 > 解决方案 > grep 哈希值是数组的数组

问题描述

我有以下哈希(结果print Dumper(\%hash)

$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',
                  ]
                ]
    };

我正在遍历哈希并想检查我是否可以grep在每个“大”数组中获得某个值。但是,我肯定在这里做错了什么。对于数组“B”,IF 条件应该为 TRUE,但对于“A”则不是。在“A”中,您只有“PRESENT_1”和“ABSENT_2”,所以这应该导致 FALSE。在数组“B”中,您同时拥有“PRESENT_1”和“PRESENT_2”,因此结果应为 TRUE。

for my $key (keys %hash) {
    if (( grep /"PRESENT_1"/, @{$hash{$key}} ) & ( grep /"PRESENT_2"/, @{$hash{$key}} )) {
        print "# OK: " , $key, " ", @{$hash{$key}}, "\n";
    } else {
        print "# DISCARD: " , $key, " ", @{$hash{$key}}, "\n";
    }
}

我想我的问题类似于这个问题:Perl Grep issue in nested hash/array,但我无法让它工作。

有人可以看看有什么问题吗?

标签: arraysperl

解决方案


您需要再取消引用一个级别。链接的问题是一个 HoA 结构,但你有一个 HoAoA。

use warnings;
use strict;

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 };
for my $key (keys %hash) {
    my $p1 = 0;
    my $p2 = 0;
    for my $aref (@{ $hash{$key} }) {
        $p1 = 1 if grep /PRESENT_1/, @{ $aref };
        $p2 = 1 if grep /PRESENT_2/, @{ $aref };
    }
    if ($p1 and $p2) {
        print "# OK: $key\n";
    }
    else {
        print "# DISCARD: $key\n";
    }
}

输出:

# DISCARD: A
# OK: B

推荐阅读