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的答案