Arrays 如何在给定密钥数组的情况下快速筛选哈希?
这是一个过度设计的解决方案,我认为可以做得更好。基本上,它需要一个键数组来创建一个过滤器字符串,并根据哈希中的每个键进行检查,以查看该键在过滤器字符串中是否有索引。。。排除标志根据_filter的结果翻转逻辑以包括或排除。也许不是最好的办法。还有更好的办法吗Arrays 如何在给定密钥数组的情况下快速筛选哈希?,arrays,perl,hash,filter,Arrays,Perl,Hash,Filter,这是一个过度设计的解决方案,我认为可以做得更好。基本上,它需要一个键数组来创建一个过滤器字符串,并根据哈希中的每个键进行检查,以查看该键在过滤器字符串中是否有索引。。。排除标志根据_filter的结果翻转逻辑以包括或排除。也许不是最好的办法。还有更好的办法吗 sub _filter{ my ($filter,$key,$joiner) = @_; $joiner = $joiner ? $joiner : '+'; my $i = index($filter,$key
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而不使用其他模块!=]
有什么想法吗
使用映射和索引。。。与使用正则表达式相比,这些是快速的ish方法,还是有更好的函数可以使用
my %filtered_hash = map { $_ => $hash{$_} } grep { exists $hash{$_} } @filter_keys;
我的%filtered\u hash=map{$\u=>$hash{$\u}}grep{exists$hash{$\u}}@filter\u keys;
有人要炸土豆片吗
my %filtered_hash;
@filtered_keys = grep { exists $hash{$_} } @filtered_keys;
@filtered_hash{@filtered_keys} = @hash{@filtered_keys};
或者将map和grep打包在一起
map{exists$hash{$}?($\=>$hash{$}):()}@filter\u keys
@EricStrom这正是我想要的!短而甜美。这将为原始哈希中不存在的键向筛选哈希添加unde
s,但您可以通过使用@filtered\u keys=grep exists$hash{$\u}、@filtered\u keys预处理键列表来修复此问题代码>。