2016-02-17 21 views
0

是否有可能过滤由哈希引用数组生成的输出,以便仅当它包含特定键或值时才打印该数组元素哈希引用,这意味着打印出整个散列该数组元素。这个例子将打印每散列中的每个元素:在perl中过滤哈希引用数组

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语句(?)的

+0

请提供示例性数据。另外,看看http://p3rl.org/Data::打印机 – simbabque

+0

你可以grep它? – 123

+0

我不确定用grepping hashref的语法 – user145265

回答

0

第一for后只需添加

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

。如果其中不存在husband密钥,它将跳过散列。

要过滤的值,使用

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

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

如果我想用指定的值打印,会不会有相应的方法? – user145265

+0

@ user145265:你是什么意思? – choroba

+0

那么你建议的方法工作正常,如果我想按键过滤,但如果我想按值过滤呢? – user145265

0
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); 
}