给出以下文件:
department=value1 location=valueA location=valueB department=value2
我使用以下内容将文件加载到Perl哈希:
use File::Slurp; use Data::Dumper; my %hash = map { s/#.*//; s/^\s+//; s/\s+$//; m/(.*?)\s*=\s*(.*)/; } read_file($file); print Dumper(\%hash);
但结果如下:
$VAR1 = { 'location' => 'valueB', 'department' => 'value2' };
如何将上述文件加载到哈希中,比方说,
$VAR1 = { 'location' => 'valueA,valueB', 'department' => 'value1,value2' };
谢谢.
干得好:
my %hash; while () { chomp; my ($key, $val) = split /=/; $hash{$key} .= exists $hash{$key} ? ",$val" : $val; }
这将遍历在'='符号上拆分的每一行,并添加一个条目或附加到哈希表中的现有条目.
如果您可以控制数据文件,请考虑从自定义格式切换到YAML之类的格式.这为您提供了大量的开箱即用功能,而不必越来越多地破解您的自定义格式.特别是,创建列表的多个键是不明显的.YAML的做法更加清晰.
name: Wally Jones department: [foo, bar] location: [baz, biff]
另请注意,YAML允许您对键/值对进行雕刻,以便它们排列以便于阅读.
解析它的代码是由一个模块完成的,YAML :: XS是最好的.
use File::Slurp; use YAML::XS; use Data::Dumper; print Dumper Load scalar read_file(shift);
数据结构如下所示:
$VAR1 = { 'department' => [ 'foo', 'bar' ], 'location' => [ 'baz', 'biff' ], 'name' => 'Wally Jones' };