Функция поиска perl hashref всегда возвращает значение по умолчанию
У меня есть следующая функция, которая ДОЛЖНА возвращать истину или ложь, когда я ищу ключ и значение в хэш-функции. Я уверен, что что-то упустил, но что?
Функция shoudl возвращает true или false, если найдены искомые строки значения ключа.
#!/usr/bin/perl
use warnings;
use strict;
my $structure = {
Key1 => {
Key4 => "findme",
Key5 => 9,
Key6 => 10,
},
Key2 => {
Key7 => "abc",
Key8 => 9,
},
};
sub lookup_key_value
{
# Arguments are a hash ref and a list of keys to find
my($hash,$findkey, $findvalue) = @_;
# Loop over the keys in the hash
foreach my $hashkey ( keys %{$hash})
{
# Get the value for the current key
my $value = $hash->{$hashkey};
# See if the value is a hash reference
if (ref($value) eq 'HASH')
{
# If it is call this function for that hash
&lookup_key_value($value,$findkey,$findvalue);
}
if ( ($findkey =~ m/^$hashkey$/) && ( $value =~ m/^$findvalue$/) )
{
print "$findkey = $hashkey, $value = $findvalue\n";
return (0);
}
}
return (1);
}
if ( &lookup_key_value($structure,"Key7","abcX") )
{
print "FOUND !\n";
} else {
print "MISSING !\n";
}
2 ответа
Решение
- это
$findkey =~ m/^$hashkey$/
должно быть$hashkey =~ m/^$findkey$/
- Вы возвращаете 0, что переводит в false в Perl, когда найдена совпадающая пара ключ / значение, и возвращает 1 (true), когда пара не найдена. Зачем? Переверните эту логику. Чтобы вернуть false, используйте простой
return;
без каких-либо аргументов.
Вы используете хеш в качестве массива пар ключ / значение, а не используете возможность адресации контента, что может сделать это быстрее и намного более кратким. Нет необходимости проверять все элементы каждого хэша
#!/usr/bin/perl
use strict;
use warnings;
my $structure = {
Key1 => { Key4 => "findme", Key5 => 9, Key6 => 10 },
Key2 => { Key7 => "abc", Key8 => 9 },
};
sub lookup_key_value {
my ( $hash, $findkey, $findvalue ) = @_;
my $val = $hash->{$findkey};
if ( not ref $val ) {
return 1 if defined $val and $val eq $findvalue;
}
for $val ( grep { ref eq 'HASH' } values %$hash ) {
return 1 if lookup_key_value( $val, $findkey, $findvalue );
}
return;
}
print lookup_key_value( $structure, 'Key7', 'abcX' ) ? "FOUND !\n" : "MISSING !\n";
выход
MISSING !