【发布时间】:2012-01-12 21:10:47
【问题描述】:
这是一个过度设计的解决方案,我认为可以做得更好。基本上,它需要一个键数组来创建一个过滤器字符串,它会针对散列中的每个键进行检查,以查看该键是否在过滤器字符串中具有索引...排除标志翻转逻辑以包含或排除基于_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 而无需额外的模块! =]
这里有一些想法?
使用地图和索引...这些快速方法与使用正则表达式相比,还是有更好的功能可以使用?
【问题讨论】: