Perl:解析文件并抓取块

时间:2015-09-03 16:10:14

标签: perl config

无法解析下面的文件并抓取哈希表或简单选项卡中的块。

我想要一个哈希表,例如

[serv-test] => parent=PRODUCTION.Windows,host=1.1.1.1

问题是我可以界定块的开始(使用/\[.*\]/)但是不可能划定结尾。我的块的结束是另一个的开始。

我的档案:

authreq=false
default.secured=false
port=3181
protocol=TCP
seclevel=2
secured=false
[serv-test]
parent=PRODUCTION.Windows
host=1.1.1.1
[citrix]
parent=PRODUCTION.Windows
host=1.1.1.2
[cluster-serv]
parent=PRODUCTION.Unix._INFRA
host=1.1.1.3
port=3182

2 个答案:

答案 0 :(得分:3)

不要担心获取哈希值,而是对获取数据感到满意。如果您在顶部指定部分名称,则会有INI File

[Default]
authreq=false
default.secured=false
port=3181
protocol=TCP
seclevel=2
secured=false
[serv-test]
parent=PRODUCTION.Windows
host=1.1.1.1
[citrix]
parent=PRODUCTION.Windows
host=1.1.1.2
[cluster-serv]
parent=PRODUCTION.Unix._INFRA
host=1.1.1.3
port=3182

现在您可以使用Config::IniFiles

use v5.10;

use Config::IniFiles;

my $cfg = Config::IniFiles->new(
    -file => "test.ini"
    ) or die "@Config::IniFiles::errors";

say "Port is ", $cfg->val( 'Default', 'port' );
say "Cluster host is ", $cfg->val( 'cluster-serv', 'host' );

如果你真的想要哈希,那就不那么难了:

use Config::IniFiles;
use Data::Dumper;

my $cfg = Config::IniFiles->new(
    -file => "test.ini"
    ) or die "@Config::IniFiles::errors";

my %hash;
foreach my $section ( $cfg->Sections ) {
    foreach my $parameter ( $cfg->Parameters( $section ) ) {
        $hash{$section}{$parameter} = $cfg->val( $section, $parameter );
        }
    }

say Dumper \%hash;

现在你有:

$VAR1 = {
          'citrix' => {
                        'parent' => 'PRODUCTION.Windows',
                        'host' => '1.1.1.2'
                      },
          'Default' => {
                         'secured' => 'false',
                         'port' => '3181',
                         'protocol' => 'TCP',
                         'default.secured' => 'false',
                         'authreq' => 'false',
                         'seclevel' => '2'
                       },
          'serv-test' => {
                           'host' => '1.1.1.1',
                           'parent' => 'PRODUCTION.Windows'
                         },
          'cluster-serv' => {
                              'port' => '3182',
                              'parent' => 'PRODUCTION.Unix._INFRA',
                              'host' => '1.1.1.3'
                            }
        };

答案 1 :(得分:0)

不要重新发明轮子。有许多现有模块可用于处理INI样式的文件,包括Config::TinyConfig::INIConfig::IniFiles,仅举几例。