从Config::Simple配置文件中使用换行符存储和读取字符串



我想从配置文件中加载一个带有换行符的字符串。我正在修改的脚本使用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,如本答案所述。

最新更新