2014-04-04 160 views
0

我需要讀取這個.conf文件。這個文件不能被Config :: Tiny,Config :: INI,Config :: Simple等模塊讀取。perl中的文件處理(.conf文件)

這裏是.conf文件,假設文件名是conference.conf:

[ConferenceId] #section 
1000 #value 
2000 
3000 
4000 

[RadioExt] 
1000=102 #parameter and value 
2000=202 
3000=302 
4000=402 

我想要的是,perl只讀取值而不是部分並將其打印出來給用戶。我仍然是perl的新手。我剛學了perl一個星期。這種類型的任務使我更難在閱讀,編寫和追加配置文件方面取得進展。

我還想要的是[ConferenceId]中的值聲明爲全局值。由於[ConferenceId]中的值發生了變化,[RadioExt]中的其他參數也發生了變化。例如,

[ConferenceId] 
1100 #the values has been changed 
2100 
3100 
4100 

[RadioExt] 
1100=102 #parameters also changed 
2100=202 
3100=302 
4100=402 

有人能幫助我嗎?我知道這是一個很大的好處。但我真的需要這個,以便我可以瞭解更多關於閱讀,編寫和附加配置文件。謝謝。

+1

你不知道關於Perl的任何信息,但是您知道所有這些模塊都無法讀取該文件?你怎麼得出這個結論? – TLP

+0

'。這個文件不能被任何模塊讀取,例如Config :: Tiny,Config :: INI,Config :: Simple等等。爲什麼? –

+0

因爲我從CPAN讀取的格式不是這樣的。不是嗎? –

回答

3

真正的答案,這是使用Config::Tiny

但是,由於這是您的老師指定的學習練習,因此我會指出您所有的perlfaq5:How do I change, delete, or insert a line in a file, or append to the beginning of a file?。這應該展示操縱文件的所有標準方法。

如果它不是一個模塊,我建議使用核心庫Tie::File來解決這個問題,但這可能不是您的老師的意圖。

所以我最後的建議是看看source for Config::Tiny。這很可能超出了你的技能範圍,但理想情況下,你可以在課程結束時閱讀整個文件。而這個問題並不需要複雜的代碼。看看別人如何解決問題可能是最好的學習方法,特別是如果你能夠識別哪些是更好的模塊。


更新

單獨Config::Tiny將無法​​解析您的文件,因爲它不是一個嚴格的ini文件格式。事實上,你的一個部分有沒有鍵的原始值不能用於任何標準模塊。

下面是如何使用正則表達式解析文件的示例。或許應該與其他錯誤檢查,以確保鍵/值對不與數組值混合得到提升,但這應該讓你開始:

use strict; 
use warnings; 

my %hash; 
my $section; 

while (<DATA>) { 
    chomp; 
    next if /^\s*$/; 

    # Begin Section 
    if (/^\s*\[(.*)\]\s*$/) { 
     $section = $1; 

    # Hash Key & Value 
    } elsif (/^(.*?)=(.*)/) { 
     $hash{$section}{$1} = $2; 

    # Array 
    } else { 
     push @{$hash{$section}}, $_; 
    } 
} 

use Data::Dump; 
dd \%hash; 

__DATA__ 
[ConferenceId] 
1000 
2000 
3000 
4000 

[RadioExt] 
1000=102 
2000=202 
3000=302 
4000=402 

輸出:

{ 
    ConferenceId => [1000, 2000, 3000, 4000], 
    RadioExt  => { 1000 => 102, 2000 => 202, 3000 => 302, 4000 => 402 }, 
} 
+0

謝謝你。我會盡力的。 –

+0

等一下。我只是注意到,當我閱讀文檔。它說Config :: Tiny版本是2.20,而我的是2.12。我試圖解開最新的文件,但我不能得到「這看起來不像一個tar檔案」的錯誤。這是什麼意思? @Miller –

+0

不知道那個錯誤是什麼意思。我建議看看[如何安裝CPAN模塊](http://www.cpan.org/modules/INSTALL.html)。 – Miller

0

即使文件擴展名爲.conf,也應該可以像讀取任何其他文本文件一樣讀取它。

你可以試試這個

$file = "<yourfilename here>"; 
open(FH,$file); 

while(<FH>) 
{ 
$line = $_; 
# here you can write your logic 
} 
+0

這部分我知道。邏輯部分是問題。 –