Сохранение и чтение строки с новой строкой из Config::Простой конфигурационный файл

#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 , как описано в этом ответе.