如何在Perl中解析此配置文件格式(允许注释)?

时间:2010-04-04 09:54:57

标签: perl

我正在从.txt文件中读取一些参数(来自用户输入),并希望确保我的脚本可以读取它,即使用户在该特定参数之前留下空格或制表符。

另外,如果我想在参数(例如7870 # this is default port number)之后为每个参数添加注释后跟#,让用户知道参数

如何在同一档案中实现?

现在,我正在使用split /\|\s/

代码:

$data_file="config.txt";
open(RAK, $data_file)|| die("Could not open file!");
@raw_data=<RAK>; 

@Ftp_Server =split(/\|\s/,$raw_data[32]);

config.txt(用户输入文件)

PING_TTL   |   1
CLIENT_PORT |   7870
FTP_SERVER  |   192.162.522.222

任何机构都可以建议我采用一种强有力的方法吗?

/岩石

5 个答案:

答案 0 :(得分:6)

除非您将此作为学习练习,否则最好的方法是使用CPAN中的配置解析模块。下面是使用Config::General的插图,它足够灵活,可以容纳您不寻常的分隔符,并且提供了对配置参数的漂亮的OO样式访问。 [注意:要使用此示例,您需要先安装Config::General模块。我提到这一点是因为看起来你在运行Sinan的例子时遇到了麻烦,这也需要你从CPAN安装一个模块。]

use strict;
use warnings;
use Config::General;

my $c = Config::General->new(
    -ConfigFile     => $ARGV[0],
    -SplitPolicy    => 'custom',     # Define | as our delimiter.
    -SplitDelimiter => qr/\s*\|\s*/,
    -ExtendedAccess => 1,            # Allow OO-style access.
);

print $_, "\n" for
    $c->PING_TTL,
    $c->CLIENT_PORT,
    $c->FTP_SERVER,
    $c->FOO,
;

测试配置文件:

PING_TTL    | 1               # default ping interval is 1 second
CLIENT_PORT | 7870            # default port
FTP_SERVER  | 192.162.522.222 # ftp server ip address
FOO         | abcd            # Make sure we can handle # and | in comments

输出:

1
7870
192.162.522.222
abcd

答案 1 :(得分:1)

那么,在第42行指定FTP_SERVER时,您的程序会做什么?

#!/usr/bin/perl

use strict; use warnings;

my %param;

while ( my $param = <DATA> ) {
    last unless $param =~ /[|]/;
    chomp $param;
    $param =~ s/^\s+//;
    $param =~ s/\s+$//;

    my ($name, $rest) = split /\s* [|] \s*/x, $param;
    my ($value, $comment) = split /\s* [#]  \s*/x, $rest, 2 ;

    $param{$name}{value} = $value;
    $param{$name}{comment} = $comment;
}

use YAML;
print Dump \%param;

__DATA__
PING_TTL   |   1 # default ping interval is 1 second
CLIENT_PORT |   7870 # default port
FTP_SERVER  |   192.162.522.222 # ftp server ip address

输出:

---
CLIENT_PORT:
  comment: default port
  value: 7870
FTP_SERVER:
  comment: ftp server ip address
  value: 192.162.522.222
PING_TTL:
  comment: default ping interval is 1 second
  value: 1

答案 2 :(得分:1)

不要重新发明轮子。有许多好的CPAN模块用于处理文件中的配置数据。一个这样的通用模块(实际上是一系列模块)是YAML

use YAML::Tiny;
my $yaml = YAML::Tiny->new;
$yaml = YAML::Tiny->read('myapp_config.yml');

答案 3 :(得分:0)

或许在一般的空格上分开

split(/\s+/, ..);

答案 4 :(得分:0)

要删除条形图两侧的空格,请使用

 split / \s* \| \s* /x , $string 

这不会处理字符串开头和结尾的空格。这样做

 $string =~ s/ ^ \s+ //x ;
 $string =~ s/ \s+ $ //x ;

要删除评论,您可以执行类似

的操作
 $string =~ s/#[^|]*//g ;

这句话删除#以及之后的任何内容都不是|。你可以将它构建到split中,但这不会处理最后一个字符串,所以我觉得最好单独处理#和split。

话虽如此,如果你想要一个强大的方法,我会看一个Config :: *模块