/ / Jak mogę szybko odfiltrować skrót z tablicy kluczy? - tablice, perl, skrót, filtr

Jak mogę szybko odfiltrować hasz podany w tablicy kluczy? - tablice, perl, hash, filtr

To jest na coś przeprojektowane rozwiązanieMyślę, że można to zrobić lepiej. Zasadniczo potrzeba tablicy kluczy, aby utworzyć ciąg filtru, który jest sprawdzany dla każdego klucza w haszu, aby sprawdzić, czy ten klucz ma indeks w ciągu filtru ... Flaga wykluczenia odwraca logikę, aby uwzględnić lub wykluczyć na podstawie wynik _filter. Prawdopodobnie nie najlepszy sposób. Jakieś lepsze sposoby?

  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

... używając standardowego perla bez dodatkowych modułów! =]

Kilka myśli tutaj?

Używając map i indeksu ... czy te szybkie metody są wykonywane w porównaniu do wykonywania wyrażeń regularnych, czy też są lepsze funkcje?

Odpowiedzi:

9 dla odpowiedzi № 1

Hash, ktoś? :

my %filtered_hash;
@filtered_keys = grep { exists $hash{$_} } @filtered_keys;
@filtered_hash{@filtered_keys} = @hash{@filtered_keys};

14 dla odpowiedzi № 2
mój% filter_hash = map {$ _ => $ hash {$ _}} grep {istnieje $ hash {$ _}} @filter_keys;