"Not a HASH reference" 创建多维散列时 perl 出错,其键能够存储多个值

"Not a HASH reference" error in perl while creating a multi-dimensional hash with its key able to store multiple values

我正在尝试创建一个多维散列,并将其键作为数组,以便相同的键可以存储多个值,并且不会被覆盖。

下面是代码片段:

my %hashR;
my @RelDiv = qw(15.4 dev ques 15.4 dev ques2 15.4 dev2 ques1 15.4 dev2 ques2 
                15.2 dev3 ques2); 
while (my $RName = shift @RelDiv) {
    my $ProStr = shift @RelDiv;
    push @{$hashR{$RName}}, $ProStr;
    my $BName = shift @RelDiv ;    ## Working file till here (tried printing the values)
    push @{$hashR{$RName}{$ProStr}}, $BName;   ###### Error on this line
}

我想要的结构如下:

{
      '15.4' => {
                   
                   'dev' => [
                                'ques',
                                'ques2'
                            ]
      
                  'dev2' => [
                               'ques1',
                               'ques2'
                             ]
                  
                },
       '15.2' => {
                   'dev3' => [
                                'ques2'
                            ]             
                }

};

但是,我收到错误消息“不是 file1.pl 行 处的 HASH 引用”。谁能帮忙解决这个错误?

谢谢

您在执行此操作时创建了一个数组引用:

push @{$hashR{$RName}}, $ProStr;
# means: $hashR{$RName} = [ $ProStr ]

那么当你这样做时,你会尝试将它用作哈希引用:

push @{ $hashR{$RName}{$ProStr} }, $BName;   ###### Error on this line
#                    ^^^-- here

很难说出你想要什么样的结构,所以我无法真正帮助你推荐。也许如果您解释了您想要实现的目标,我可以提供帮助。


随着新结构的更新,这是一种简单的方法

use strict;
use warnings;
use Data::Dumper;

my %hash;
my @RelDiv = qw(15.4 dev ques 15.4 dev ques2 15.4 dev2 ques1 15.4 dev2 ques2 15.2 dev3 ques2); 

while (@RelDiv) {
    my ($RName, $ProStr, $BName) = splice @RelDiv, 0, 3;
    push @{ $hash{$RName}{$ProStr} }, $BName;
}
print Dumper \%hash;

输出(数据结构):

$VAR1 = {
          '15.4' => {
                      'dev2' => [
                                  'ques1',
                                  'ques2'
                                ],
                      'dev' => [
                                 'ques',
                                 'ques2'
                               ]
                    },
          '15.2' => {
                      'dev3' => [
                                  'ques2'
                                ]
                    }
        };

然而,下面的批评仍然存在。关于您的数据收集,有些事情您没有说,并且这个使用数组 splice 的解决方案不是很好。你应该退一步谈谈你的数据收集。

不过,这不是创建散列的好方法。如果您只是打算在开始时将值列表分配给数组,请立即将其分配给散列,并且不要将这种奇怪的转换成另一种结构。或者,如果我怀疑您正在从文件中读取数据,请再次立即创建散列结构。如果你再详细点,我可以提供更好的建议。