已经提出了许多类似的问题,但我的问题非常具体,似乎没有任何答案可行。
以下脚本循环运行(超过@keys
)。我想检查一些模式是否可用作值(第二个if
)。如果是,请从中获取结束数字。然后,我想在一个不一定存在的数组中添加该数字索引的值。下面的示例输入/输出可能会澄清事情。
引用可能有点复杂,但是%ini
是一个哈希,bf
中有一个哈希,另一个在那里,例如topattrs
。最后,在下一个元素$v
中,如果它还不存在,我想创建一个数组alts
。它必须是一个数组而不是哈希,因为这个数组的顺序很重要!然后,我想在该索引位置添加$alt
的值。
my @keys = keys %{$ini{'bf'}};
foreach (@keys) {
my $v = $ini{'bf'}{$_};
if (my ($p, $d) = $_ =~ /(top|sub)attr(\d+)$/) {
$ini{'bf'}{"${p}attrs"}{$v} = 1;
delete $ini{'bf'}{$_};
if (my ($alt) = grep( /${p}attr${d}_alt\d+/, @keys ) ) {
my ($altd) = $alt =~ /(\d+)$/;
$ini{'bf'}{"${p}attrs"}{$v}{'alts'}[$altd] = $ini{'bf'}{$alt}; # line 23
}
}
}
print Dumper(\%ini);
但是,Perl给我一个错误:
在第23行使用“strict refs”时,不能使用字符串(“1”)作为HASH引用。
所以我猜Perl将alts
解释为哈希,即使我想将它用作数组,所以在引用时我必须做错事。也许这个数组事先不存在的事实也与它有关吗?
示例输入:
$VAR1 = {
'bf' => {
'subattr2_alt2' => 'pos',
'subattr2_alt1' => 'pt',
'topattr1' => 'cat',
'subattr1' => 'rel',
'subattr2' => 'cat'
}
};
想要输出:
$VAR1 = {
'bf' => {
'topattrs' => {
'cat' => 1
},
'subattrs' => {
'cat' => ['pt', 'pos'],
'rel' => 1
}
}
答案 0 :(得分:2)
您将$ini{'bf'}{"${p}attrs"}{$v}
设置为1,然后稍后(第23行)尝试使用相同的哈希值。
my @keys = keys %{$ini{'bf'}};
foreach (@keys) {
my $v = $ini{'bf'}{$_};
if (my ($p, $d) = $_ =~ /(top|sub)attr(\d+)$/) {
$ini{'bf'}{"${p}attrs"}{$v} = 1; #### <==== HERE
delete $ini{'bf'}{$_};
if (my ($alt) = grep( /${p}attr${d}_alt\d+/, @keys ) ) {
my ($altd) = $alt =~ /(\d+)$/;
$ini{'bf'}{"${p}attrs"}{$v}{'alts'}[$altd] = $ini{'bf'}{$alt}; # line 23
}
}
}
print Dumper(\%ini);
将标记的行更改为
$ini{'bf'}{"${p}attrs"}{$v} = {} ;
或者只是删除该行,因为perl会因自动生成而创建所需的hashref。