首页 > 解决方案 > 当严格的参考检查中存在同一级别的值时,perl检查是否存在哈希键

问题描述

对于以下严格检查的代码,它会引发错误。

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 行引发一个错误。实际上,另一个人在一个文件中创建了这个没有严格的哈希,当我在另一个文件中写另一部分时,我有严格的并且它引发了这样一个问题。

标签: perlhashkeystrict

解决方案


以下将字符串存储在$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';

推荐阅读