Из документации Config :: Крошечный:
... Config :: Крошечный не сохраняет ваши комментарии, пробелы, или порядок ваш конфигурационный файл. См. Config :: Tiny :: Ordered (и, возможно, другие) для сохранения порядка записей в файле.
Итак, сделайте то, что предлагает документация, и см. Config :: Tiny :: Ordered.
Обновление: Основываясь на комментариях, я постараюсь предоставить дополнительную помощь здесь.
Во-первых, ваш существующий скрипт в основном представляет собой копию-копию из конфига Config :: Tiny, без какого-либо глубокого понимания того, что делает большинство. Соответствующие части ... или, по крайней мере, те части, которые вы должны иметь являются:
use Config::Tiny;
$file = 'sss.conf';
$Config = Config::Tiny->read($file);
$Config->{amrit}->{host} = 'Not Bar!';
$Config->write($file);
Если добавить use Data::Dumper;
в верхней части сценария, и сразу же после чтения конфигурационного файла вы добавляете print Dumper $Config;
, структура будет выглядеть это:
{
'amrit' => {
'call-limit' => '22',
'host' => '111.118.253.145',
'secret' => 'password',
'context' => 'sip-calling',
'port' => '2776',
'username' => 'amrit',
'allow' => 'gsm',
'qualify' => 'yes',
'type' => 'friend',
'disallow' => 'all'
}
}
Изменение структуры со сценарием я написал выше будет работать, если вы не против пары ключ/значение, чтобы их заказы переставить. Но вам нужно сохранить порядок. Поэтому было предложено переключиться на Config :: Tiny :: Ordered. Этот модуль сохраняет порядок, изменяя структуру по-разному. Если вы измените сценарий выглядеть следующим образом:
use Data::Dumper;
use Config::Tiny::Ordered;
$file = 'conf.conf';
$Config = Config::Tiny->read($file);
print Dumper $Config;
Вы увидите, что структура теперь выглядит следующим образом:
{
'amrit' =>
[
{
'value' => 'friend',
'key' => 'type'
},
{
'key' => 'host',
'value' => '111.118.253.145'
},
{
'value' => '2776',
'key' => 'port'
},
{
'value' => 'amrit',
'key' => 'username'
},
{
'value' => 'password',
'key' => 'secret'
},
{
'value' => 'all',
'key' => 'disallow'
},
{
'key' => 'allow',
'value' => 'gsm'
},
{
'key' => 'context',
'value' => 'sip-calling'
},
{
'key' => 'qualify',
'value' => 'yes'
},
{
'value' => '22',
'key' => 'call-limit'
}
]
}
Или, другими словами, внутренняя структура Config :: Крошка: : * объект изменился с хеша хэшей, на хэш массивов хешей.(«» Все проблемы в информатике могут быть решены другим уровнем косвенности »- David Wheeler) Это изменение формы структуры данных существует, чтобы отойти от проблемы хешей, которые являются неупорядоченными контейнерами.
Теперь вместо удобного поиска хэша для ключа с именем «host» вам необходимо выполнить итерацию по вашей структуре, чтобы найти элемент массива с анонимным хешем с ключевым полем с именем host. Больше работы:
use List::Util qw(first);
use Config::Tiny::Ordered;
$file = 'sss.conf';
$Config = Config::Tiny::Ordered->read($file);
my $want_ix = first {
$Config->{amrit}[$_]{key} eq 'host'
} 0 .. $#{$Config->{amrit}};
$Config->{amrit}[$want_ix]{value} = 'Not Bar!';
$Config->write($file);
Это работает, запустив через amrit
секции конфигурационного файла ищет элемент в анонимный массив этой структуры, которая имеет анонимный хэш с поля под названием «ключ», и как только этот элемент массива найденный, изменяя хэш-элемент 'value' на 'Not Bar!'
Если это одно время для вас, все готово. Если вы захотите сделать это самостоятельно в следующий раз, прочитайте perldoc perlreftut
, perldoc perldsc
, а также документацию для любых используемых здесь функций, которые не сразу становятся ясными.
, но когда я использую Config :: Tiny :: Ordered, я получил эту ошибку - не ссылку ARRAY на /usr/local/share/perl5/Config/Tiny/Ordered.pm строке 92. i просто заменяет Config :: Tiny на Config :: Tiny :: Ordered – user2916639
Используйте Data :: Dumper для сброса структуры $ Config. Это, вероятно, будет поучительным. – DavidO
На самом деле я новичок в perl, я знаю. как бы я это сделал .. – user2916639