[英]Array of hash; Can't use string (“1”) as an ARRAY ref while “strict refs”?
[英]Can't use string (“1”) as a HASH ref, embedded hash issue
已经提出了许多类似的问题,但我的回答很具体,似乎没有一个答案可行。
下面的脚本循环运行(通过@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 ref。
因此,我想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
}
}
您将$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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.