1

我正在尝试将带有记录的多行配置文件读入 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

读这个的最好方法是什么?模块?多行匹配的正则表达式?蛮力?我不知道下一步要去哪里。

4

3 回答 3

8

这是您的数据集的一个选项:

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

希望这可以帮助!

于 2012-11-05T02:47:03.807 回答
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

于 2012-11-05T05:33:04.477 回答
0

一次读一行。

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

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

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

于 2012-11-05T02:44:54.427 回答