perl - 在 Perl 中优雅地解析刚性数据

标签 perl parsing coding-style

我正在处理一个基本上可以归结为如下内容的大型数据集:

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/

相关文章:

perl - 编写测试以确保 Perl 脚本加载特定模块

java - 如何有效地从文件中解析串联的 XML 文档

php - 读取远程目录的选项

python - 为什么 BeautifulSoup 会抛出这个 HTMLParseError?

c - 这些编码风格的名称是什么?

javascript - 是否有保存函数的 javascript 变量的命名约定?

mysql - Perl:遇到最后一个数组元素时跳出 foreach 循环

javascript - 什么 perl 正则表达式可以正确匹配 javascript 关联数组?

perl - 如何使用 cpan 命令下载模块的源代码?

haskell - 为什么 Haskell 中的无点风格在满分的情况下称为无点? "point-free"这个词是从哪里来的?