对于以下经过严格检查的代码,它将引发错误。
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”处于同一级别。当“存在”尝试查找键d时,调试器将发现存在相同级别的值并引发错误,因为“ e”不是要检查的键。 在保持哈希结构和使用严格的情况下如何解决?
是的,这会在第8行引发错误。实际上,另一个在没有严格限制的情况下在一个文件中创建了此哈希,而当我在另一个文件中写入另一部分时,我却是严格的,这会引起这样的问题。
答案 0 :(得分: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';
答案 1 :(得分:3)
如果您不希望检查,除非c级是哈希,只需检查一下即可:
<div class="container">
<table>
<thead>
<tr>
<th>Column A</th>
<th>Column B</th>
<th>Column C</th>
<th>Column D</th>
<th>Column E</th>
<th>Column F</th>
</tr>
</thead>
<tbody>
<tr>
<td>Row 1 Cell 1</td>
<td>Row 1 Cell 2</td>
<td>Row 1 Cell 3</td>
<td>Row 1 Cell 4</td>
<td>Row 1 Cell 5</td>
<td>Row 1 Cell 6</td>
</tr>
<tr>
<td>Row 2 Cell 1</td>
<td>Row 2 Cell 2</td>
<td>Row 2 Cell 3</td>
<td>Row 2 Cell 4</td>
<td>Row 2 Cell 5</td>
<td>Row 2 Cell 6</td>
</tr>
<tr>
<td>Row 3 Cell 1</td>
<td>Row 3 Cell 2</td>
<td>Row 3 Cell 3</td>
<td>Row 3 Cell 4</td>
<td>Row 3 Cell 5</td>
<td>Row 3 Cell 6</td>
</tr>
</tbody>
</table>
</div>
<style>
.container {
width: 30em;
overflow-x: auto;
white-space: nowrap;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: .5em 1em;
}
</style>