我想从配置文件中加载一个带有换行符的字符串。我正在修改的脚本使用Config::Simple模块。
这是MWE:
# file: script.pl
use strict;
use warnings;
use Config::Simple;
# read config file
my $cfg = new Config::Simple('config.cfg');
my %config = $cfg->vars();
# read parameter 'string'
my $var = $config{"string"};
print($var);
这适用于config.cfg
:中的"正常"字符串
# file: config.cfg
string: "One Two Three"
现在我想在参数string
中存储一个带有换行符的字符串。由于Config::Simple
要求每个参数都在一行上(即不支持多行参数(,我尝试了以下
# file: config.cfg
string: "One nTwo nThree"
但似乎Config::Simple
去掉了字符,因为
$var
变成了
One nTwo nThree
有没有一个好的方法可以用Config::Simple
做到这一点?
当您查看Config::Simple
的源代码时,您会发现它从Text::ParseWords调用parse_line
,它将:
删除所有不是其本身的引号和反斜杠反斜杠转义
我看不到修改Config::Simple
行为的方法,但有一种选择是将配置文件更改为反斜杠:
string: "One \nTwo \nThree"
该输出:
One nTwo nThree
有趣的是,如果使用param()
方法而不是vars()
方法,则会得到不同的输出:
use strict;
use warnings;
use Config::Simple;
my $cfg = new Config::Simple('config.cfg');
my $var = $cfg->param('string');
print "$varn";
输出:
One
Two
Three
我在@toolic的回答下解决了我的问题:
当我将配置文件更改为包含双反斜杠时,我会在$var
:中得到字符n
# file: config.cfg
string: "One \nTwo \nThree"
剩下要做的唯一一件事就是用实际的换行符替换两个字符n
:
# file: script.pl
use strict;
use warnings;
use Config::Simple;
# read config file
my $cfg = new Config::Simple('config.cfg');
my %config = $cfg->vars();
# read parameter 'string' and regex-replace '\n' with 'n'
my $var = $config{"string"} =~ s/\n/n/gr;
print($var);
这给了我
One
Two
Three
如我所愿。
EDIT:似乎只有在使用Config::Simple
的哈希方法通过.vars()
访问值时才需要替换。在方法param()
中,替换实际上已经在Config::Simple
中实现,但只是在那里(v4.59中的错误,作者已收到通知(。因此,使用param()
或替换n
,如本答案所述。