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

时间:2017-04-04 10:49:55

标签: arrays perl hash reference

已经提出了许多类似的问题,但我的问题非常具体,似乎没有任何答案可行。

以下脚本循环运行(超过@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
    }
  }

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。