我正在处理一个基本上可以归结为如下内容的大型数据集:
my $input = q(
<foo>111</foo>
<foo>222</foo>
<foo>333</foo>
<foo></foo>
<foo>555</foo>
); # new-lines are either CR+LF, LF, or CR
基于上面的示例,我们假设以下约束生效:
- 总会有 5 行数据。
- 每行中的数据都包含在单个标记中,例如
<foo>...</foo>
. - 数据将不包含嵌套标签。
- 所有行都使用相同的标签(例如
foo
)来包含它们的数据。
最终,以上述为数据源,我想得到类似这样的结果:
my %values = (
one => '111',
two => '222',
three => '333',
four => '',
five => '555'
);
这是我的尝试:
my @vals = $input =~ m!<foo>(.*?)</foo>!ig;
if (scalar @vals != 5) {
# panic
}
my %values = (
one => shift @vals,
two => shift @vals,
three => shift @vals,
four => shift @vals,
five => shift @vals
);
这可以按我的意愿工作,但是它看起来很丑而且不是很灵活。不幸的是,这是我目前能做的最好的事情,因为我是 Perl 的新手。
那么,考虑到上述限制,更优雅的方法是什么?
最佳答案
将两个数组合并成一个散列:
my @keys = qw/one two three/;
my @values = qw/alpha beta gamma/;
my %hash;
@hash{@keys} = @values;
关于perl - 在 Perl 中优雅地解析刚性数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415364/