2012-03-29 85 views
5

我正在製作一個需要讀取和獲取INI文件值的Perl腳本。Perl:通過INI文件迭代

INI文件格式:

[name] 
Property=value 

例子:

[switch_6500] 
cpu=1.5.1.12.4 
free_memory=1.45.32.16 

[oracle_db_11g] 
param1=value1 
param2=value2 
param3=value3 
param4=value4 
... 

正如你所看到的,不可能有任何區段量,即包含任意數量的參數。部分名稱/參數的名稱將始終不同。

我需要做的是讓我的Perl腳本遍歷每個部分,並獲取該部分的所有參數名稱/值。我已經習慣了與INI文件做簡單地與參數這樣的名稱一起指定部分名稱:

#!/usr/bin/perl -w 

    use strict; 
    use warnings; 
    use Config::Tiny; 

    # Read the configuration file 
    my $Config = Config::Tiny->new(); 
    $Config = Config::Tiny->read('configfile.ini'); 
    my $Metric1_var = $Config->{switch_6500}->{cpu}; 
    my $Metric2_var = $Config->{switch_6500}->{free_memory}; 

不過,現在我已經有了部分的名稱/參數不確定的量,以及由於不知道他們的名字,我似乎無法找出提取所有值的方法。我環顧Config :: IniFiles模塊,它有一些有趣的東西,但我似乎無法找到一種方法來獲取參數值而不知道部分/參數名稱。

如果任何人都可以通過迭代這個INI文件來幫助我,那將不勝感激。

謝謝。

回答

6

你可以做你想要什麼Config::Tiny。只需使用keys功能遍歷所有的哈希鍵,如下所示:

use strict; 
use Config::Tiny; 

my $config = Config::Tiny->read('configfile.ini'); 

foreach my $section (keys %{$config}) { 
    print "[$section]\n"; 
    foreach my $parameter (keys %{$config->{$section}}) { 
     print "\t$parameter = $config->{$section}->{$parameter}\n"; 
    } 
} 

注:因爲散列「散列」,而不是有序像陣列,按鍵的順序返回可能似乎無意義。由於訂單在INI文件中無關緊要(只有哪些參數放置在哪個部分很重要),這應該不成問題。

+0

非常感謝,這正是我一直在尋找的。 – user1300922 2012-03-29 14:54:17

5

我個人比較喜歡Config::Simple。您可以將其稱爲param()方法,不帶任何參數來返回文件中的所有參數。它還有一些比Config::Tiny更好的功能。

+0

CPAN產品+1。 – Zaid 2012-03-29 14:37:37

2

我明白你很滿意解析ini文件。 如果你只是想循環所有部分&他們的密鑰對,然後

你可以循環哈希散列這樣。

foreach my $Section (keys %$Config) { 
print "[$Section]"; 
foreach my $Key (keys %{$Config->{$Section}}) { 
    print "$Key = $Config->{$Section}->{$Key}"; 
} 
} 
+0

這個工作完美。謝謝:) – user1300922 2012-03-29 14:57:11