Как я могу быстро отфильтровать хэш, заданный массив ключей? - PullRequest
3 голосов
/ 13 января 2012

Это слишком спроектированное решение для чего-то, что, я думаю, может быть сделано лучше.По сути, для создания строки фильтра требуется массив ключей, который проверяется по каждому ключу в хэше, чтобы увидеть, есть ли у этого ключа индекс в строке фильтра ... Флаг исключения переворачивает логику для включения или исключения на основерезультат _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 ... это быстрые методы по сравнению с регулярным выражением, или есть лучшие функции для использования?

Ответы [ 2 ]

15 голосов
/ 13 января 2012
my %filtered_hash = map { $_ => $hash{$_} } grep { exists $hash{$_} } @filter_keys;
9 голосов
/ 14 января 2012

Кто-нибудь?:

my %filtered_hash;
@filtered_keys = grep { exists $hash{$_} } @filtered_keys;
@filtered_hash{@filtered_keys} = @hash{@filtered_keys};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...