外部スコープでキー変数を使用するのが最も簡単な方法だと思います。
コード
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
my $key = 'unlabeled';
my %value;
while (defined(my $line = <DATA>)) {
chomp $line;
# key line
if ($line =~ /^>(.*)/) {
$key = $1;
next;
}
# value line
push @{$value{$key}}, $line;
}
say "$_: " . join ', ' => @{$value{$_}} for keys %value;
__DATA__
>label1
line1
line2
>label2
line1
line2
出力
label1: line1, line2
label2: line1, line2
説明
最後に見たハッシュ キーを$key
、行反復ループの外側のスコープの変数に保存します。ループが次のキー行を検出すると、$key
文字列を置き換えます。新しいキーの配列が存在しない場合、perl の自動有効化メカニズムはハッシュ内に新しい空の配列を作成します。の下のハッシュに既に何かがある場合$key
は、既存の行の後に新しい行が追加されます。
編集: 入力がキー行で始まらない場合、最初の非キー行がキーに追加されますunlabeled
。
編集 2 : ラベルの行を連結したい場合、これは で簡単に行うことができますjoin "\n" => @{$value{$_}}
。そのようにしたい場合は、配列のものを捨てて、非常に似ているが新しい行を連結するだけの @perreal のソリューションを使用できます。
編集 3 : ええ、自動活性化! :) (ありがとう@TLP)