当严格引用检查中存在相同级别的值时,perl检查哈希键的存在

时间:2018-06-21 20:51:18

标签: 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}{$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行引发错误。实际上,另一个在没有严格限制的情况下在一个文件中创建了此哈希,而当我在另一个文件中写入另一部分时,我却是严格的,这会引起这样的问题。

2 个答案:

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