簡體   English   中英

在Perl中,如何將未知長度的文件讀入多個散列中以存儲在數組中以備后用?

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

其中{ ... }是對匿名哈希的引用。

就是說,當每個散列都只有一個nameargs時,您想要一個散列數組讓我感到有些驚訝。 為什么沒有從名稱到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM