Perl - 从配置文件中读取多行记录

时间:2012-11-05 02:36:26

标签: perl

我正在尝试将多行配置文件中的记录读入perl哈希数组

示例配置文件:

    record_1
      phone=5551212
      data=1234234
    end_record_1

    record_2
      people_1=bob
      people_2=jim
      data=1234
    end_record_2

    record_3
     people_1=sue
    end_record_3

这就是我要找的东西:

$myData{1}{"phone"}  <--- 5551212
$myData{1}{"data"}   <--- 1234234

$myData{2}{"people_1"} <--- bob
... etc

阅读此内容的最佳方式是什么?模块?正则表达式与多行匹配?蛮力?我在空中接下来要去哪里。

3 个答案:

答案 0 :(得分:7)

以下是您的数据集的一个选项:

use strict;
use warnings;
use Data::Dumper;

my %hash;
{
    local $/ = '';
    while (<DATA>) {
        my ($rec) = /record_(\d+)/;
        $hash{$rec}{$1} = $2 while /(\S+)=(.+)/g;
    }
}

print Dumper \%hash;

__DATA__
record_1
    phone=5551212
    data=1234234
end_record_1

record_2
    people_1=bob
    people_2=jim
    data=1234
end_record_2

record_3
    people_1=sue
end_record_3

输出:

$VAR1 = {
          '1' => {
                   'data' => '1234234',
                   'phone' => '5551212'
                 },
          '3' => {
                   'people_1' => 'sue'
                 },
          '2' => {
                   'people_1' => 'bob',
                   'data' => '1234',
                   'people_2' => 'jim'
                 }
        };

设置local $/ = ''会导致空行被视为数据集中的“记录分隔符”,因此我们可以在这些记录上使用正则表达式来获取哈希键/值的信息。

希望这有帮助!

答案 1 :(得分:1)

这有很多模块,所以最好的做法是(像往常一样)使用它们而不是重新发明轮子。

从您发布的配置文件的片段中,看起来Config::Simple可能是最佳选择。如果您可以简化配置格式,那么Config::Tiny将更容易使用。如果事情变得更复杂,那么您可能必须使用Config::General

http://metacpan.org/pod/Config::Tiny

http://metacpan.org/pod/Config::Simple

http://metacpan.org/pod/Config::General

答案 2 :(得分:0)

一次只读一行。

当您看到新记录时,将新的空关联数组添加到myData并获取对它的引用 - 这将是您的“当前记录”。

现在,当您在一行上看到键/值对时,可以将其添加到当前记录数组(如果有)

当您看到记录的结尾时,您只需清除对当前记录的引用。