Perl - 使用字符串代替散列键

问题描述 投票:0回答:2

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

$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}}"; }

你能告诉我怎样才能做到这一点,谢谢

perl hash
2个回答
1
投票

我建议你稍微重写那个循环并用字符串插值构建你的密钥。你不需要$name用于循环之外的任何事情。

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

由于您需要键的字符串,只需构建一个字符串。


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 ];
© www.soinside.com 2019 - 2024. All rights reserved.