#perl #config #newline
#perl #конфигурация #новая строка
Вопрос:
Я хотел бы загрузить строку с новыми строками из файла конфигурации. Скрипт, который я изменяю, использует модуль 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
помощью?
Ответ №1:
Когда вы смотрите на исходный код Config::Simple
, вы видите, что он вызывает parse_line
из Text::ParseWords, который будет:
удалите все кавычки и обратную косую черту, которые сами по себе не экранированы обратной косой чертой
Я не вижу способа изменить поведение 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
Комментарии:
1. Отлично, это заставило меня найти решение. Добавьте замену к вашему ответу, и у меня есть именно то, что мне было нужно. Я добавил ответ с полным решением.
Ответ №2:
Я решил свою проблему с помощью ответа @toolic:
Когда я изменяю конфигурационный файл, чтобы включить двойные обратные косые черты, я получаю символы n
в $var
:
# 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
, но только там (ошибка в версии 4.59, автор был уведомлен). Так что либо используйте param()
, либо замените n
, как описано в этом ответе.