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

Store and read string with newline from Config::Simple config file

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

# 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,这将:

remove all quotes and backslashes that are not themselves backslash-escaped

我看不到修改 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