0

我有一个看起来有点像这样的配置文件:

add
    1
    2
concatenate
    foo
    bar
    blat

我想要做的是把它变成像%hash = (name=>"add", args=> [1,2])etc这样的哈希,并将哈希引用推送到一个数组中。遍历文件并创建每个散列似乎很简单,除了在命名这些散列以将它们的引用推入数组时我卡住了。配置文件将一直在更改,并且要存储可变数量的不同名称/参数组合。有没有办法遍历哈希名称,以便我可以一次将它们推送到一个数组中?

到目前为止,它看起来像这样:

my %temphash = (name=>'add', args=>[1,2]);  

push (@array, \%temphash);

我可以把它%temphash变成动态生成的东西并在继续下一个之前推动它吗?

编辑:上下文

计划是使用那些“名称”键来调用子程序。所以这样的事情可以工作:

my %subhash = (add=>\&addNumbers, concatenate=>\&concat);

除了我需要调用的子例程列表在配置文件中,我不知道它们是什么,直到我开始阅读它。即使我在配置文件中包含子例程的名称,我如何遍历它们并将它们作为元素添加到该哈希中?

4

3 回答 3

2

好吧,您可以简单地使用大括号来制作匿名哈希:

push @array, { name => 'add', args => [1,2] };

您可以利用my声明的词法范围创建相同的效果。例如:

my @array;
while ( ... ) {
    ...
    my %hash = ( ... );
    push @array, \%hash;
}
于 2012-08-16T21:04:50.360 回答
1

如果我正确理解您的要求,那么您可以写:

push @array, { name=>'add', args=>[1,2] };

where{ ... }是对匿名哈希的引用。

name也就是说,当每个散列只有一个和时,你想要一个散列数组,我有点惊讶args。为什么没有从名称到参数的单个哈希映射?:

%array = ( add => [ 1, 2 ], concatenate => [ 'foo', 'bar', 'baz' ] );
于 2012-08-16T21:04:39.377 回答
0

像这样的东西会做你需要的

use strict;
use warnings;

open my $fh, '<', 'data_file' or die $!;

my $item;
my @data;

while (<$fh>) {
  chomp;
  next unless /^(\s*)(.+?)\s*$/;
  if ($1) {
    push @{ $item->{args} }, $2;
  }
  else {
    push @data, $item if $item;
    $item = { name => $2, args => [] };
  }
}
push @data, $item if $item;

use Data::Dump;
dd \@data;

输出

[
  { args => [1, 2], name => "add" },
  { args => ["foo", "bar", "blat"], name => "concatenate" },
]
于 2012-08-16T21:34:00.397 回答