【问题标题】:using string variables as names for hash in loop - perl [duplicate]在循环中使用字符串变量作为哈希的名称 - perl [重复]
【发布时间】:2014-07-16 20:07:25
【问题描述】:

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

示例代码:

#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(例如组合),然后将其提供为用作哈希名称(%combined)。

有什么办法吗?

谢谢

【问题讨论】:

    标签: arrays perl loops hash


    【解决方案1】:

    可以,但这是个坏主意。考虑改用多维数据结构。

    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?

    【讨论】:

    • 另外,请注意您的程序流程中有一个我没有解决的错误。您根据计数类型打开一个文件,循环遍历您的键,写入第一个,关闭文件,然后继续循环,没有打开文件句柄来写入后续键。您应该将您的关闭移出键的迭代。
    • 哦,对,哈哈,我的错。但是好的,非常感谢!
    【解决方案2】:

    出于各种可维护性和远距离诡异动作的原因,使用可变字符串访问命名散列是一个坏主意。这就是为什么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}) {
        ...
    

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2014-05-21
      • 1970-01-01
      • 2012-07-18
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多