Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中解析此配置文件格式(允许注释)?_Perl - Fatal编程技术网

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

如何在Perl中解析此配置文件格式(允许注释)?,perl,Perl,我正在从一个.txt文件的用户输入中读取一些参数,并希望确保我的脚本能够读取这些参数,即使用户在该特定参数之前留下了一个空格或选项卡 此外,如果我想为每个参数添加注释,然后在参数(例如7870)之后添加注释,这是默认端口号,以让用户了解该参数 如何在同一个文件中实现它 现在,我正在使用split/\\124;\ s/ 代码: config.txt用户输入文件 有没有人能给我一个强有力的建议 /rocky可能在空白处出现分歧 split(/\s+/, ..); 要删除条形图两侧的空间,请使用

我正在从一个.txt文件的用户输入中读取一些参数,并希望确保我的脚本能够读取这些参数,即使用户在该特定参数之前留下了一个空格或选项卡

此外,如果我想为每个参数添加注释,然后在参数(例如7870)之后添加注释,这是默认端口号,以让用户了解该参数

如何在同一个文件中实现它

现在,我正在使用split/\\124;\ s/

代码: config.txt用户输入文件 有没有人能给我一个强有力的建议


/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');