Perl 从Config::Simple Config文件中存储并读取带有换行符的字符串
我想从配置文件中加载一个带有换行符的字符串。我正在修改的脚本使用该模块 这里有一个MWE: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{&
# 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
,如回答中所述。太好了,这让我找到了解决方案。给你的答案加上一个替代品,我就得到了我所需要的。我用完整的解决方案添加了一个答案。