Perl - 使用字符串代替散列键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl - 使用字符串代替散列键相关的知识,希望对你有一定的参考价值。
在动态循环中,我想生成字符串然后将它们分配为散列键,然后将一些值绑定到它们中的每一个。我做的是(不使用严格)
$number = 1; %clause = ();
for(condition)
{
if (condition)
{
$name = join '', 'hash', $number;
$clause{$$name} = [ @somearray ];
$number++;
}
}
我所期待的是使用一个名为hash1,hash2等的键的子句哈希。现在它实际上工作,但只有一次,仅用于最后一个值。例如,我编写此代码,它只输出分配给最后一个散列键的最后一个数组。似乎$ name被覆盖了
foreach $key (keys %clause)
{ print "@{$clause{$key}}"; }
你能告诉我怎样才能做到这一点,谢谢
答案
我建议你稍微重写那个循环并用字符串插值构建你的密钥。你不需要$name
用于循环之外的任何事情。
use strict;
my $number = 1;
for my $item (@items)
{
if ( i_care_about($item) )
{
$clause{"hash$number"} = [ @somearray ];
$number++;
}
}
由于您需要键的字符串,只需构建一个字符串。
另一答案
总是使用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 ];
以上是关于Perl - 使用字符串代替散列键的主要内容,如果未能解决你的问题,请参考以下文章