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