"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
的解决方案不是很好。你应该退一步谈谈你的数据收集。
不过,这不是创建散列的好方法。如果您只是打算在开始时将值列表分配给数组,请立即将其分配给散列,并且不要将这种奇怪的转换成另一种结构。或者,如果我怀疑您正在从文件中读取数据,请再次立即创建散列结构。如果你再详细点,我可以提供更好的建议。
我正在尝试创建一个多维散列,并将其键作为数组,以便相同的键可以存储多个值,并且不会被覆盖。
下面是代码片段:
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
的解决方案不是很好。你应该退一步谈谈你的数据收集。
不过,这不是创建散列的好方法。如果您只是打算在开始时将值列表分配给数组,请立即将其分配给散列,并且不要将这种奇怪的转换成另一种结构。或者,如果我怀疑您正在从文件中读取数据,请再次立即创建散列结构。如果你再详细点,我可以提供更好的建议。