2014-02-14 74 views
-1

我正在使用perl腳本更新conf文件中的部分。我的腳本我工作正常,但是當我執行腳本時,訂購的部分自動更改,而我不想改變order.script如下。使用perl更新Conf文件

#!/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 :: Tiny ::有序(可能還有其他)保存文件中條目的順序。

因此,請按照文檔中的建議,並參閱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' 
    } 
    ] 
} 

或者換句話說,該配置的內部結構::微型: :*對象已經從散列哈希變爲散列數組的散列。(「在計算機科學中的所有問題都可以通過間接的另一個層面來解決」 - David Wheeler)這種變化在數據結構的形狀存在從哈希是無序容器的問題移開。

所以現在不是方便哈希查詢名爲「主機」的關鍵,你必須通過你的結構迭代地發現,有一個名爲主機鍵字段匿名散列的數組元素。更多的工作:

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

但是當我使用配置::微型::有序我得到這個錯誤 - 不是在/usr/local/share/perl5/Config/Tiny/Ordered.pm線92.我的數組引用只是將Config :: Tiny替換爲Config :: Tiny ::訂購 – user2916639

+0

使用Data :: Dumper轉儲$ Config結構。這可能是有啓發性的。 – DavidO

+0

其實我是perl的初學者,我知道。我將如何做到這一點...... – user2916639

1

CPAN page

最後,配置::微小的不保留您的意見,空格,或爲了你的配置文件。

使用COnfig::Tiny::Ordered代替

參閱config ::微型::有序(和其他終端)的文件中的條目順序的保存。

+0

但是當我使用配置::微型::有序我得到這個錯誤 - 不是在/usr/local/share/perl5/Config/Tiny/Ordered.pm線92數組引用我只是取代配置::微小以配置::微型::有序 – user2916639