具有以下文件结构 - 请参阅DATA部分:
#!/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}
例如,每个奇数行包含一个唯一的“名称”,每个偶数行包含多个“键值”对 - 以空格分隔。
- 密钥始终是一个单词 (\w+)
- 该值可以是:
- 一个字符串 (\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 中编写 sub。