如何在Perl中解析此配置文件格式(允许注释)?
我正在从一个.txt文件的用户输入中读取一些参数,并希望确保我的脚本能够读取这些参数,即使用户在该特定参数之前留下了一个空格或选项卡 此外,如果我想为每个参数添加注释,然后在参数(例如7870)之后添加注释,这是默认端口号,以让用户了解该参数 如何在同一个文件中实现它 现在,我正在使用split/\\124;\ s/ 代码: config.txt用户输入文件 有没有人能给我一个强有力的建议如何在Perl中解析此配置文件格式(允许注释)?,perl,Perl,我正在从一个.txt文件的用户输入中读取一些参数,并希望确保我的脚本能够读取这些参数,即使用户在该特定参数之前留下了一个空格或选项卡 此外,如果我想为每个参数添加注释,然后在参数(例如7870)之后添加注释,这是默认端口号,以让用户了解该参数 如何在同一个文件中实现它 现在,我正在使用split/\\124;\ s/ 代码: config.txt用户输入文件 有没有人能给我一个强有力的建议 /rocky可能在空白处出现分歧 split(/\s+/, ..); 要删除条形图两侧的空间,请使用
/rocky可能在空白处出现分歧
split(/\s+/, ..);
要删除条形图两侧的空间,请使用
split / \s* \| \s* /x , $string
这不会处理字符串开头和结尾的stface。为了这个
$string =~ s/ ^ \s+ //x ;
$string =~ s/ \s+ $ //x ;
要删除注释,可以执行以下操作
$string =~ s/#[^|]*//g ;
这句话的意思是删除a和后面任何不是a的东西。你可以将其构建到分割中,但这无法处理最后一个字符串,因此我觉得最好将分割和分割分开处理
话虽如此,如果您想要一种健壮的方式,我将查看其中一个配置::*模块那么,当第42行指定FTP_服务器时,您的程序会做什么
#!/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
1
7870
192.162.522.222
abcd
除非您将此作为学习练习,否则最好的方法是使用CPAN中的配置解析模块。下面是一个使用的示例,它足够灵活,可以容纳不寻常的分隔符,并且它提供了一个很好的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
输出:
---
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
1
7870
192.162.522.222
abcd
不要重新发明轮子。有许多好的CPAN模块用于处理文件中的配置数据。一个这样的通用模块实际上是一个模块族,它是:
唯一可靠的方法是仁慈地杀死代码。顺便说一句,你可能想花一点时间来学习如何使用这个网站。很好的例子。顺便说一下,如果注释包含或|,则当前代码不会执行正确的操作。我想一个解决方案可能是3-arg分割。还是CPAN?@FM-CPAN是个不错的选择。但是,我不知道是否有一个模块支持|作为分隔符和内联注释。对于OP:我认为您应该采用标准配置文件格式之一,而不是使用自己的格式。这些是YAML,%param吗,我根本无法获取。。。我得到了一个config.txt文件,其中包含一个由用户输入的no if值$data_file=config.txt;openRAK$data|U文件|无法打开文件!;@raw_data=;其中一个操作系统是@Ftp\u Server=split/\\124;\ s/,$raw\u data[32];my$FTP_SERVER=$FTP_SERVER[1]$原始数据[32]=~s/^\s+//x$原始数据[32]=~s/\s+$//x;&我在使用每个值之前都这样做过,就像$FTP\u服务器一样,我认为你的程序在所有值上都做过一次,之后可以使用任何值。请您在这里解释一下我的程序,因为我没有在上面讲到。@rockyurock您熟悉Perl中的循环和数据结构吗?我喜欢这个语句,除非您将此作为学习练习。有时,当你自己尝试做某件事,意识到它更难或有陷阱,然后去CPAN是值得的。
use YAML::Tiny;
my $yaml = YAML::Tiny->new;
$yaml = YAML::Tiny->read('myapp_config.yml');