繁体   English   中英

不能将字符串(“ 1”)用作HASH引用,嵌入式哈希问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM