Arrays 如何在给定密钥数组的情况下快速筛选哈希?

Arrays 如何在给定密钥数组的情况下快速筛选哈希?,arrays,perl,hash,filter,Arrays,Perl,Hash,Filter,这是一个过度设计的解决方案,我认为可以做得更好。基本上,它需要一个键数组来创建一个过滤器字符串,并根据哈希中的每个键进行检查,以查看该键在过滤器字符串中是否有索引。。。排除标志根据_filter的结果翻转逻辑以包括或排除。也许不是最好的办法。还有更好的办法吗 sub _filter{ my ($filter,$key,$joiner) = @_; $joiner = $joiner ? $joiner : '+'; my $i = index($filter,$key

这是一个过度设计的解决方案,我认为可以做得更好。基本上,它需要一个键数组来创建一个过滤器字符串,并根据哈希中的每个键进行检查,以查看该键在过滤器字符串中是否有索引。。。排除标志根据_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而不使用其他模块!=]

有什么想法吗

使用映射和索引。。。与使用正则表达式相比,这些是快速的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预处理键列表来修复此问题