Perl-使用字符串代替哈希键

时间:2019-01-04 21:59:01

标签: perl hash

在动态循环中,我想生成字符串,然后将其分配为哈希键,然后将一些值绑定到它们中的每一个。我所做的是(不使用严格)

$number = 1; %clause = ();

for(condition)
  {
     if (condition)
     { 
       $name = join '', 'hash', $number; 
       $clause{$$name} =  [ @somearray ];
       $number++;
    }
 }

我期望的是拥有一个带有称为hash1,hash2 ..等键的子句hash,现在它实际上可以工作,但是只能工作一次,仅对最后一个值有效。例如,我编写此代码,它仅输出分配给最后哈希键的最后一个数组。 $ name似乎已被覆盖

foreach $key (keys %clause)

{ print "@{$clause{$key}}"; }

谢谢你能告诉我我该怎么做

2 个答案:

答案 0 :(得分:1)

我建议您稍微重写一下该循环,并使用字符串插值法构建密钥。循环外的任何内容都不需要$name

use strict;
my $number = 1;
for my $item (@items)
{
  if ( i_care_about($item) )
  { 
   $clause{"hash$number"} =  [ @somearray ];
   $number++;
  }
}

由于您需要一个字符串作为密钥,因此只需构建一个字符串即可。

答案 1 :(得分:1)

始终使用use strict;。它将发现您的问题。 (Global symbol "$hash1" requires explicit package name

始终使用use warnings qw( all );。它将发现您的问题。 (Use of uninitialized value in hash element


您的代码使用变量$hash1的值作为键。由于您从未为$hash1分配任何内容,因此该值为undef,它将被字符串化为一个空字符串。这意味着

 $name = join '', 'hash', $number; 
 $number++;
 $clauses{$$name} =  [ @somearray ];

等同于

 $number++;
 $clauses{""} =  [ @somearray ];

只需将$$name(由$name命名的变量的值)替换为$name$name的值)。

 $name = join '', 'hash', $number; 
 $number++;
 $clauses{$name} =  [ @somearray ];

已清理:

 my $name = 'hash' . $number++;
 $clauses{$name} =  [ @somearray ];

但是为什么不使用数组?

 push @clauses, [ @somearray ];