【问题标题】:How do I load a file into a Perl hash?如何将文件加载到 Perl 哈希中?
【发布时间】:2010-09-19 02:58:57
【问题描述】:

给定以下文件:

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

谢谢。

【问题讨论】:

    标签: perl file hash


    【解决方案1】:

    给你:

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

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

    【讨论】:

    • 谢谢。刚刚插入 chomp($val)。奇迹般有效。 :)
    • 当我在 Windows 上使用 Perl 5.12.1 进行测试时,值总是有一个前面的逗号....我必须将最后一条语句更改为完整的 if 条件。
    【解决方案2】:

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

    我已经有一段时间没有使用 Perl 了,但是当我过去做过类似的事情时,我逐行读取文件(而 $inputLine = )并使用 split on '=' 来加载带有额外检查的散列,以查看散列是否已经具有该键,如果条目已经存在,则追加。

    【讨论】:

      【解决方案3】:

      如果您可以控制数据文件,请考虑从自定义格式切换到 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'
              };
      

      【讨论】:

      • 行 print Dumper Load scalar read_file(shift);看起来很可疑。缺少双冒号?
      • @gorn 是正确的。 Dumper() 来自 Data::Dumper,Load() 来自 YAML::XS,scalar 是内置的,read_file() 来自 File::Slurp。有了括号,它看起来像print(Dumper(Load(scalar(read_file(shift))))),这就是我放弃括号的原因。
      猜你喜欢
      • 2015-07-06
      • 2015-07-07
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2020-12-08
      • 2012-05-05
      • 2011-11-22
      相关资源
      最近更新 更多