Функция поиска 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 ответа

Решение
  1. это $findkey =~ m/^$hashkey$/ должно быть $hashkey =~ m/^$findkey$/
  2. Вы возвращаете 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 !
Другие вопросы по тегам