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

perl检查在严格的refs检查中有相同级别的值时是否存在哈希键,perl,hash,key,strict,Perl,Hash,Key,Strict,对于以下带有严格检查的代码,它将引发错误 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}

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

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”不是要检查的键。 在保持哈希的结构和使用严格的


是的,它将在第8行引发错误。实际上,另一个用户在一个文件中创建了这个哈希,但没有严格限制,当我在另一个文件中编写另一部分时,我使用了严格限制,这就产生了这样一个问题。

如果您不想进行检查,除非c级是哈希,请检查:

if (ref $database{$a}{$b}{$c} ne 'HASH') {
    print "not a hash\n";
}
elsif (exists $database{$a}{$b}{$c}{'d'}){
    print "success!\n";
}

以下内容在
$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';

在第一次赋值中,
$database{'a'}{'b'}{'c'}
是一个字符串(
e
),因此在第二次赋值中,您尝试使用相同的变量(这是一个字符串)作为散列来存储一对
('d','f')
,在尝试第一个
foreach
之前,它不能按照错误消息告诉您的方式工作。您需要重新访问您的数据结构。避免使用
my$a和<代码>我的$b
因为
$a
$b
是一种保留的Perl变量,您可能会感到惊讶。@PatrickMevzek-ok,我将不再使用这些保留值。我只是想做个例子…好主意!谢谢。有关允许字符串和哈希在同一“级别”的数据结构,请参阅ikegami的答案