Perl 从Config::Simple Config文件中存储并读取带有换行符的字符串

Perl 从Config::Simple Config文件中存储并读取带有换行符的字符串,perl,config,newline,Perl,Config,Newline,我想从配置文件中加载一个带有换行符的字符串。我正在修改的脚本使用该模块 这里有一个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{&

我想从配置文件中加载一个带有换行符的字符串。我正在修改的脚本使用该模块

这里有一个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
的源代码时,您会看到它调用
parse\u 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 "$var\n";
输出:

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
如我所愿


编辑:似乎只有在使用
Config::Simple
的哈希方法通过
.vars()
访问值时才需要替换。在方法
param()
中,替换实际上已经在
Config::Simple
中实现,但仅在那里实现(v4.59中的错误,已通知作者)。因此,请使用
param()
或替换
\n
,如回答中所述。

太好了,这让我找到了解决方案。给你的答案加上一个替代品,我就得到了我所需要的。我用完整的解决方案添加了一个答案。