使用字符串变量作为循环中的哈希的名称 - perl

时间:2014-05-27 19:27:13

标签: arrays perl loops hash

我有一个字符串数组,我想在循环中使用,然后稍后调用哈希的名称。我写了一个测试文件来玩它,但无论我多努力,我都无法让它工作。它一直给我“不能使用字符串作为哈希引用,而严格的引用正在使用”。我可以关闭严格的引用,但然后代码只是跳过这些行,并没有做我想要的。有没有办法评估包含字符串的变量,然后将其传递给哈希的名称?

示例代码:

#usr/bin/perl
use strict;

my %combined = ();
my %highmut = ();
$combined{'a'} = 1;
$combined{'b'} = 2;
$highmut{'c'} = 3;
$highmut{'d'} = 4;
my @counts = ('combined', 'highmut');
foreach my $count (@counts) {
  my $file = $count . '.txt';
  open(my $random, ">>", $file);
  foreach my $key (keys %{$count}) {
    print $random "key: $key \t %{$count{$key}} \n";
    close($random);
  }
}

具体而言,问题在于最后几行中的%{$ count}和%{$ count {$ key}}。

我想要的是评估$ count(如合并),然后将其作为哈希名称(%组合)使用。

有没有办法做到这一点?

由于

2 个答案:

答案 0 :(得分:3)

你可以,但这不是一个坏主意。请考虑使用多维数据结构。

my %data = ( combined => { a => 1,
                           b => 2,
                         },
             highmut => { c => 3,
                          d => 4,
                        },
           );
foreach my $count (keys %data) {
  my $file = $count . '.txt';
  open(my $random, ">>", $file);
  foreach my $key (keys %{$data{$count}}) {
    print $random "key: $key \t $data{$count}{$key} \n";
  }
  close($random);
}

注意:您的程序流程中也存在错误。您可以根据计数类型打开文件,循环键,写入第一个文件,关闭文件,然后继续循环,不打开文件句柄以写入后续键。因此,我将你的关闭移出密钥。

进一步阅读:

http://perldoc.perl.org/perlfaq7.html#How-can-I-use-a-variable-as-a-variable-name%3f

perl variable substitution in variable name

In Perl, how can I use a string as a variable name?

答案 1 :(得分:1)

使用变量字符串来访问命名哈希值对于所有类型的可维护性和远距离的怪异动作都是一个坏主意。这就是为什么use strict 'refs'不允许您故意或偶然地执行此操作的原因。如果这是您真正想做的事情,请停用strict refs

foreach my $count (@counts) {
  my $file = $count . '.txt';
  open(my $random, ">>", $file);
  no strict 'refs';
  foreach my $key (keys %{$count}) {
    ...