给定以下文件:
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 (<FILE>)
{
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'
};
你能在你的map函数中添加一些代码来检查哈希条目是否存在并附加新值吗?
我已经有一段时间没有做过 Perl了,但是当我过去做这样的事情时,我逐行读取文件(而 $inputLine =