我正在从.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]);
PING_TTL | 1 CLIENT_PORT | 7870 FTP_SERVER | 192.162.522.222
任何机构都可以建议我采用一种强有力的方法吗?
/岩石
答案 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 :: *模块