次のファイル構造を持っています -データセクションを参照してください:
#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw(extract_bracketed);
my($ALL, $name, $pairs);
while(defined($name = <DATA>) && defined($pairs = <DATA>)) {
$ALL->{$name} = parse_pairs($pairs);
}
sub parse_pairs {
my $str = shift;
my($extracted, $remainder) = extract_bracketed($str,'{}'); # how to?
}
__DATA__
name1
key1 val1 key2 {val2a val2b} key3 val3
name2
key2 val2 key3 val3
name3
key1 {val1a val1b val1c} key2 {val2a val2b}
たとえば、すべての奇数行には一意の「名前」が含まれ、すべての偶数行にはスペースで区切られた複数の「キーと値」のペアが含まれます。
- キーは常に 1 つの単語 (\w+)
- 値は次のとおりです。
- 1 つの文字列 (\S+)、または
- ブラケット { } で囲まれた、スペースで区切られた複数の文字列
上記のファイルを perl 構造にする必要があります。
$ALL => {
name1 => {
key1 => ["val1"],
key2 => ["val2a", "val2b"],
key3 => ["val3"]
},
[.......]
また
$ALL => {
name1 => {
key1 => {
val1 => undef,
},
key2 => {
val2a => undef,
val2b => undef,
}
key3 => {
val3 => undef,
}
},
[.......]
これはおそらくText::Ballanced の仕事ですが、使用方法がわかりません。ここには混合値があり、単純な単語だけのものもあれば、バランスが取れているものもあります - 括弧で囲まれており、抽出を繰り返す方法がわからない. ;(
parse_pairs
上記のsrcにサブを記述する方法について、いくつかのヒントが必要です。