11

给定以下文件:

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'
        };

谢谢。

4

3 回答 3

22

干得好:

my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

这将遍历“=”符号上的每一行拆分,并添加一个条目或附加到哈希表中的现有条目。

于 2008-10-24T22:35:53.250 回答
5

如果您可以控制数据文件,请考虑从自定义格式切换到 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'
        };
于 2008-10-26T00:21:20.237 回答
-1

您可以在 map 函数中添加一些代码来检查哈希条目是否存在并附加新值吗?

我已经有一段时间没有使用 Perl 了,但是当我过去做这样的事情时,我逐行读取文件(而 $inputLine = <FILE>)并使用 split on '=' 来加载散列附加检查以查看哈希是否已经具有该键,并附加该条目是否已存在。

于 2008-10-24T22:39:36.613 回答