我正在尝试将多行配置文件中的记录读入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
阅读此内容的最佳方式是什么?模块?正则表达式与多行匹配?蛮力?我在空中接下来要去哪里。
答案 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
答案 2 :(得分:0)
一次只读一行。
当您看到新记录时,将新的空关联数组添加到myData
并获取对它的引用 - 这将是您的“当前记录”。
现在,当您在一行上看到键/值对时,可以将其添加到当前记录数组(如果有)
当您看到记录的结尾时,您只需清除对当前记录的引用。