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