grep hash 其中值是数组的数组

grep hash where values are array of arrays

我有以下哈希(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 每个 'big' 数组中的特定值。 但是,我肯定在这里做错了什么。 IF 条件对于数组 'B' 应该为 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,但我做不到。

有人能看出哪里出了问题吗?

您需要再取消引用一级。链接的问题是一个 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