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 - 使用字符串代替散列键的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据操作之字符串与散列键的区别 | Redis

Redis常用命令 字符串键散列键

根据散列键名批量删除redis散列值

以正确的顺序散列键和值

bash 使用散列键从 CSV 多列中读取

散列键/值作为数组[重复]