[英]In Perl how can I read a file of unknown length into multiple hashes to be stored in an array for later use?
我有一個配置文件,看起來像這樣:
add
1
2
concatenate
foo
bar
blat
我想做的是將其轉換為%hash = (name=>"add", args=> [1,2])
等哈希,然后將哈希引用推入單個數組中。 遍歷文件並創建每個哈希似乎很簡單,除了在命名這些哈希值以將其引用推入數組中時遇到麻煩。 配置文件將一直更改,並具有可變數量的不同名稱/參數組合來存儲。 有沒有一種方法可以遍歷哈希名稱,以便我可以一次將它們推入一個數組中?
到目前為止,它看起來像這樣:
my %temphash = (name=>'add', args=>[1,2]);
push (@array, \%temphash);
我可以將%temphash
轉換為即時生成的內容,並在繼續進行下一個之前將其推送嗎?
編輯:上下文
計划是使用那些“名稱”鍵來調用子例程。 所以這樣的事情可以工作:
my %subhash = (add=>\&addNumbers, concatenate=>\&concat);
除了我需要調用的子例程列表位於配置文件中之外,直到我開始從中讀取內容時,我才知道它們是什么。 即使我在配置文件中包含了子例程的名稱,如何遍歷它們並將它們作為元素添加到該哈希中?
好吧,您只需使用大括號即可進行匿名哈希處理:
push @array, { name => 'add', args => [1,2] };
您可以利用my
聲明的詞法范圍來創建相同的效果。 例如:
my @array;
while ( ... ) {
...
my %hash = ( ... );
push @array, \%hash;
}
如果我正確理解了您的要求,則可以編寫:
push @array, { name=>'add', args=>[1,2] };
其中{ ... }
是對匿名哈希的引用。
就是說,當每個散列都只有一個name
和args
時,您想要一個散列數組讓我感到有些驚訝。 為什么沒有從名稱到args的單個哈希映射? :
%array = ( add => [ 1, 2 ], concatenate => [ 'foo', 'bar', 'baz' ] );
這樣的事情將滿足您的需求
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" },
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.