【问题标题】:Filter array of hash references in perl在 perl 中过滤哈希引用数组
【发布时间】:2016-02-17 15:21:26
【问题描述】:

是否可以过滤由哈希引用数组生成的输出,以仅在包含特定键或值的情况下打印该数组元素哈希引用,我的意思是打印出该数组元素的整个哈希。此示例代码将打印出每个元素中的每个哈希:

for $i ( 0 .. $#AoH ) {
 print "$i is { ";
 for $role ( keys %{ $AoH[$i] } ) {
     print "$role=$AoH[$i]{$role} ";
 }
 print "}\n";
}

我将如何过滤该输出以仅打印具有包含某个键或值的 hashref 的元素?

hashref 示例:

push @AoH, { husband => "fred", wife => "wilma", daughter => "pebbles" };

output:
husband=fred wife=wilma daughter=pebbles

只有在某种 if-statement(?) 中指定了键之一(丈夫/妻子/女儿)或值之一(fred/wilma/pebbles)时,才会打印示例数据

【问题讨论】:

  • 请提供示例数据。另外,看看p3rl.org/Data::Printer
  • 你可以 grep 吗?
  • 我不确定 grepping hashref 的语法

标签: arrays perl hash


【解决方案1】:

只需添加

next unless exists $AoH[$i]{husband};

在第一个 for 之后。如果其中不存在 husband 键,它将跳过哈希。

要过滤值,请使用任一

next unless grep 'john' eq $_, values %{ $AoH[$i] };

next unless { reverse %{ $AoH[$i] } }->{homer};

【讨论】:

  • 如果我想按指定值打印,有没有对应的方法?
  • @user145265:你什么意思?
  • 如果我想按键过滤,您建议的方法可以正常工作,但如果我想按值过滤怎么办?
  • @user145265:next unless grep 'john' eq $_, values %{ $AoH[$i] };next unless { reverse %{ $AoH[$i] } }->{homer};
【解决方案2】:
my %keys_to_find = map { $_ => 1 } qw( husband wife daughter );
my %vals_to_find = map { $_ => 1 } qw( fred wilma pebbles );

for my $person (@persons) {
   my $match =
      grep { $keys_to_find{$_} || $vals_to_find{$person->{$_}} }
         keys(%$person);

   next if !$match;

   say
      join ' ',
         map { "$_=$person->{$_}" }
            sort keys(%$person);
}

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 2011-07-26
    • 2016-06-06
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2011-12-29
    • 2012-09-21
    相关资源
    最近更新 更多