对于我认为可以做得更好的事情,这是一个过度设计的解决方案。基本上,它需要一组键来创建一个过滤字符串,该字符串会根据哈希中的每个键进行检查,以查看该键是否在过滤字符串中有一个索引... exclude标志将逻辑翻转为包含或排除基于_filter的结果。可能不是最好的方式。有更好的方法吗?
sub _filter{
my ($filter,$key,$joiner) = @_;
$joiner = $joiner ? $joiner : '+';
my $i = index($filter,$key);
if($i >= 0){
my $c;
$c = substr($filter, $i-1, 1);
print STDERR "\nc => $c [$key][$i]";
if($i==0){ return 1; }
return($c eq $joiner);
}
return 0;
}
sub hashFilter{
my($hash,$filter_keys,$exclude) = @_;
return 0 unless isHash($hash) && $filter_keys;
$exclude = $exclude ? $exclude : 0;
my $filter = isArray($filter_keys)? join('+',@$filter_keys) : $filter_keys;
print STDERR "FILTER is > $filter";
my $p = {map { ( _filter($filter,$_) == $exclude ) ? ($_ => $$hash{$_}) : () } keys %$hash};
return $p;
}
#isArray() and isHash() just check the ref value for "ARRAY" or "HASH" respectively
...使用标准perl而无需额外的模块! =]
有些想法吗?
使用map和index ...这些快速方法与正则表达式相比,还是有更好的函数可供使用?
答案 0 :(得分:15)
my %filtered_hash = map { $_ => $hash{$_} } grep { exists $hash{$_} } @filter_keys;
答案 1 :(得分:9)
my %filtered_hash;
@filtered_keys = grep { exists $hash{$_} } @filtered_keys;
@filtered_hash{@filtered_keys} = @hash{@filtered_keys};