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";
}
- 这个
$findkey =~ m/^$hashkey$/
应该是$hashkey =~ m/^$findkey$/
- 当找到匹配的 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 !
我有以下函数,当我在 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";
}
- 这个
$findkey =~ m/^$hashkey$/
应该是$hashkey =~ m/^$findkey$/
- 当找到匹配的 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 !