通过当前的哈希数组循环;构建一个新的哈希数组,并忽略具有某些键=值的记录

时间:2019-02-22 21:40:23

标签: perl

我有很多记录的$ arr,但是为了简单起见,我在这里只显示了2条记录:

$arr = [
     {
       'a' => 1,
       'b' => 2,
       'c' => 'failed'
     },
     {
       'a' => 5,
       'b' => 6,
       'c' => 'success'
    },
    {...}, {...}, {...}
    ];

我想循环通过$ arr并忽略任何带有'c'='success'的记录,并放入一个新的$ newarr;还是可以覆盖$ arr而不是创建一个新的$ newarr。

$newarr = [
     {
       'a' => 1,
       'b' => 2,
       'c' => 'failed'
     }
];

1 个答案:

答案 0 :(得分:4)

一个简单的grep应该可以达到以下目的:

  • @{}取消引用数组ref
  • grep {}将过滤器应用于结果列表
  • $_->{c] ne 'success'应该应用于每个元素的过滤器
  • grep是列表中每个元素的别名$_:在您的情况下,每个列表元素都是哈希引用
  • $->{c}取消引用哈希引用以检索键c的值
  • 注意::这是一种浅表复制方法,即@{ $arr }@new包含对相同哈希引用的引用。

有关详细信息,请参见perlfunc

#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper;

my $arr = [
    {
        'a' => 1,
        'b' => 2,
        'c' => 'failed',
    },
    {
        'a' => 5,
        'b' => 6,
        'c' => 'success',
    },
];

my @new = grep { $_->{c} ne 'success' } @{ $arr };

print Dumper(\@new);

exit 0;

试运行:

$ perl dummy.pl
$VAR1 = [
          {
            'c' => 'failed',
            'b' => 2,
            'a' => 1
          }
        ];