perl hashref 查找函数总是返回默认值

perl hashref lookup function always returning default value

我有以下函数,当我在 hashref 中查找键和值时,它应该 return true 或 false。我确定我错过了什么,但是什么?

如果找到我们搜索的键值字符串,函数应该 return 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";
}
  1. 这个$findkey =~ m/^$hashkey$/应该是$hashkey =~ m/^$findkey$/
  2. 当找到匹配的 key/value 对时,您 returning 0,在 Perl 中转换为 false,当未找到对时 returning 1(真)。为什么?颠倒这个逻辑。要 return false,请使用简单的 return;,不带任何参数。

您将散列用作 key/value 对的数组,而不是使用内容寻址功能,这可以使此过程更快、更简洁。无需检查每个散列的所有元素

#!/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 !