В этой строке здесь:
my $scrubbed_hash = map { defined $hash_ref->{$_} ? ($_ => $hash_ref->{$_}) : () } keys %{$hash_ref};
Вы назначаете список из map
в скаляр $scrubbed_hash
.map
в скалярном контексте вернет количество элементов в списке (10).
Вместо присвоения скаляру присвойте множественному хешу:
sub scrub_hash{
my($self,$hash_ref) = @_;
my %scrubbed_hash = map { defined $hash_ref->{$_} ? ($_ => $hash_ref->{$_}) : () } keys %{$hash_ref};
print STDERR "[scrub]". $_."\n" for values %scrubbed_hash;
}
Если вы действительноЕсли вы хотите использовать скаляр для $scrubbed_hash
, вам нужно будет обернуть оператор map в {map {...} args}
, который создаст анонимный хеш из списка.
Чтобы отфильтровать элементы на месте, вы можете использоватьdelete
функция:
my %hash = (foo => 1, bar => undef, baz => 2);
defined $hash{$_} or delete $hash{$_} for keys %hash;
print join ', ' => keys %hash; # foo, baz
за обновление:
Метод scrub_empty_params
должен выглядеть примерно так:
sub scrub_empty_params {
my ($self, $hash) = @_;
{map {defined $$hash{$_} ? ($_ => $$hash{$_}) : ()} keys %$hash}
}
Если этоне работает для вас, тогда может быть, что ваши значения определены, но имеют длину 0.
sub scrub_empty_params {
my ($self, $hash) = @_;
{map {(defined $$hash{$_} and length $$hash{$_}) ? ($_ => $$hash{$_}) : ()} keys %$hash}
}
Возможно, вы захотите удалить немного котельной из вашего API, создав другой ->Vars()
метод, который возвращает отфильтрованный хеш:
sub clean_vars {
my ($self) = @_;
$self->scrub_empty_params($self->Vars)
}