從文檔配置::微型:
...配置::微小的不保留您的意見,空格,或者你的配置文件的順序。 請參閱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
以及此處所使用的任何功能的文檔,這些功能都不是很清楚。
但是當我使用配置::微型::有序我得到這個錯誤 - 不是在/usr/local/share/perl5/Config/Tiny/Ordered.pm線92.我的數組引用只是將Config :: Tiny替換爲Config :: Tiny ::訂購 – user2916639
使用Data :: Dumper轉儲$ Config結構。這可能是有啓發性的。 – DavidO
其實我是perl的初學者,我知道。我將如何做到這一點...... – user2916639