对于我认为可以做得更好的事情,这是一个过度设计的解决方案.基本上,它需要一组键来创建一个过滤字符串,该字符串会根据哈希中的每个键进行检查,以查看该键是否在过滤字符串中有一个索引… 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而无需额外的模块! =]
有些想法吗?
解决方法
哈希切片,有人吗? :
my %filtered_hash; @filtered_keys = grep { exists $hash{$_} } @filtered_keys; @filtered_hash{@filtered_keys} = @hash{@filtered_keys};