perl在严格refs检查中存在相同级别的值时检查是否存在哈希键

问题描述 投票:0回答:2

对于具有严格检查的以下代码,将引发错误。

use strict;
my $a;
my $b;
my $c;

my %database;
$database{'a'}{'b'}{'c'} = 'e';
$database{'a'}{'b'}{'c'}{'d'} = 'f';
foreach my $a (keys %database){
  foreach my $b (keys %{$database{$a}}){
    foreach my $c (keys %{$database{$a}{$b}}){
      if (exists $database{$a}{$b}{$c}{'d'}){print "success!\n";}
    }
  }
}

错误信息:

Can't use string ("e") as a HASH ref while "strict refs" in use at test.pl line 8.

值'e'和键'd'处于同一水平。当“exists”尝试查找键d时,调试器将发现存在相同级别的值并引发错误,因为“e”不是要检查的键。如何在保持hash的结构和使用strict时解决它?

是的,它会在第8行引发错误。实际上另一个在一个文件中创建了这个哈希而没有严格,当我在另一个文件中写另一个部分时,我有严格的并且它引发了这样的问题。

perl hash key strict
2个回答
4
投票

以下内容在$database{'a'}{'b'}{'c'}中存储一个字符串:

$database{'a'}{'b'}{'c'} = 'e';

但是以下期望$database{'a'}{'b'}{'c'}成为参考:

$database{'a'}{'b'}{'c'}{'d'} = 'f';

假设您可以在任何级别拥有值,则需要将数据结构更改为以下内容:

$database{a}{children}{b}{children}{c}{value} = 'e';
$database{a}{children}{b}{children}{c}{children} = 'f';

3
投票

如果你不想做检查,除非c级是哈希,只需检查:

if (ref $database{$a}{$b}{$c} ne 'HASH') {
    print "not a hash\n";
}
elsif (exists $database{$a}{$b}{$c}{'d'}){
    print "success!\n";
}
© www.soinside.com 2019 - 2024. All rights reserved.