对于具有严格检查的以下代码,将引发错误。
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行引发错误。实际上另一个在一个文件中创建了这个哈希而没有严格,当我在另一个文件中写另一个部分时,我有严格的并且它引发了这样的问题。
以下内容在$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';
如果你不想做检查,除非c级是哈希,只需检查:
if (ref $database{$a}{$b}{$c} ne 'HASH') {
print "not a hash\n";
}
elsif (exists $database{$a}{$b}{$c}{'d'}){
print "success!\n";
}