0

次のような構成ファイルがあります。

add
    1
    2
concatenate
    foo
    bar
    blat

私がやろうとしているのは、これを%hash = (name=>"add", args=> [1,2])などのハッシュに変換し、ハッシュ参照を単一の配列にプッシュすることです。ファイルをループして各ハッシュを作成するのは簡単に思えますが、これらのハッシュに名前を付けてそれらの参照を配列にプッシュするときに行き詰まります。構成ファイルは常に変更され、保存するさまざまな名前/引数の組み合わせが可変数になります。一度に 1 つずつ配列にプッシュできるように、ハッシュ名を反復処理する方法はありますか?

これまでのところ、次のようになります。

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

push (@array, \%temphash);

%temphashそれをその場で生成されたものにして、次のものに進む前にプッシュできますか?

編集:コンテキスト

これらの「name」キーを使用してサブルーチンを呼び出す計画です。したがって、次のようなものが機能します。

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] };

ここ{ ... }で、匿名ハッシュへの参照です。

そうは言っても、各ハッシュに と しかないのに、ハッシュの配列が必要なことには少し驚いてい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 に答える