在动态循环中,我想生成字符串,然后将其分配为哈希键,然后将一些值绑定到它们中的每一个。我所做的是(不使用严格)
$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}}"; }
谢谢你能告诉我我该怎么做
答案 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 ];