2014-02-14 5 views
-1

Я использую скрипт perl для обновления разделов в файле conf. мой скрипт работает нормально, но когда я запускаю скрипт, упорядоченные по разделам меняются автоматически, а я не хочу менять order.script.update Conf Файл с использованием perl

#!/usr/bin/perl 
use Config::Tiny; 
$file = 'sss.conf'; 
my $Config = Config::Tiny->new; 
$Config = Config::Tiny->read($file); 
my $rootproperty = $Config->{_}->{rootproperty}; 
$Config->{amrit}->{host} = 'Not Bar!'; 
$Config->write($file); 

и содержимое файла следующая строка;

[amrit] 
type=friend 
host=111.118.253.145 
port=2776 
username=amrit 
secret=password 
disallow=all 
allow=gsm 
context=sip-calling 
qualify=yes 
call-limit=22 

Пожалуйста, помогите мне здесь я не хочу, чтобы изменить порядок полей

ответ

2

Из документации 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, а также документацию для любых используемых здесь функций, которые не сразу становятся ясными.

+0

, но когда я использую Config :: Tiny :: Ordered, я получил эту ошибку - не ссылку ARRAY на /usr/local/share/perl5/Config/Tiny/Ordered.pm строке 92. i просто заменяет Config :: Tiny на Config :: Tiny :: Ordered – user2916639

+0

Используйте Data :: Dumper для сброса структуры $ Config. Это, вероятно, будет поучительным. – DavidO

+0

На самом деле я новичок в perl, я знаю. как бы я это сделал .. – user2916639

1

Из CPAN page:

Наконец, Config :: Крошечный не сохраняет ваш комментарий, пробелов, или порядка вашего конфигурационного файла.

Использование COnfig::Tiny::Ordered вместо

См Config :: Крошечный :: Заказанный (и, возможно, другие) для сохранения порядка записей в файле.

+0

но когда я использую Config :: Tiny :: Ordered я получил эту ошибку - не ссылку ARRAY на /usr/local/share/perl5/Config/Tiny/Ordered.pm строке 92. Я просто заменяет Config :: Tiny to Config :: Tiny :: Ordered – user2916639

Смежные вопросы