2012-03-29 22 views
5

Robię skrypt Perla, który musi odczytać i uzyskać wartości pliku INI.Perl: Iterowanie poprzez pliki INI

INI File Format:

[name] 
Property=value 

Przykład:

[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 
... 

Jak widać, nie może być dowolna ilość odcinków, które zawierają dowolną liczbę parametrów. Nazwy sekcji/parametrów będą zawsze różne.

To, co muszę zrobić, to sprawdzić, czy mój skrypt Perla przechodzi przez każdą sekcję i uzyskać wszystkie nazwy/wartości parametrów tej sekcji. Co ja jestem przyzwyczajony do robienia z plikami INI jest po prostu podając nazwę sekcji wraz z nazwą parametru jak ten:

#!/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}; 

Jednak teraz, że mam nieokreślony ilość sekcji Nazwy/parametrów, jak również ponieważ nie znając ich nazw, nie potrafię wymyślić sposobu na wyodrębnienie wszystkich wartości. Rozglądałem się przy module Config :: IniFiles i ma on kilka interesujących rzeczy, ale nie mogę znaleźć sposobu na uzyskanie wartości parametru bez znajomości nazwy sekcji/parametru.

Jeśli ktoś może mi pomóc w iteracji przez ten plik INI, byłoby to bardzo cenne.

Dziękuję.

Odpowiedz

6

Możesz robić, co chcesz z Config::Tiny. Wystarczy skorzystać z funkcji keys iteracyjne nad wszystkie klucze mieszania, co następuje:

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"; 
    } 
} 

Uwaga: Ponieważ hashe są „zaszyfrowaną”, a nie zamawiać jak macierze są, kolejność klawiszy wrócił może wydaje się bezsensowne. Ponieważ kolejność nie ma znaczenia w pliku INI (tylko rozmieszczenie, których parametrów dotyczy sekcja), nie powinno to stanowić problemu.

+0

Dziękuję bardzo, dokładnie tego właśnie szukałem. – user1300922

5

Ja osobiście wolę Config::Simple. Możesz nazwać to metodą param() bez argumentów, aby zwrócić wszystkie parametry z twojego pliku. Ma również kilka innych fajnych funkcji ponad Config::Tiny.

+0

+1 dla ofert CPAN. – Zaid

2

Rozumiem, że jesteś zadowolony z parsowania plików ini. Jeśli chcesz tylko przechodzić przez wszystkie sekcje & ich pary kluczy, to

Możesz przechodzić przez Hash-Of-Hash w ten sposób.

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

To działa idealnie. Dziękuję :) – user1300922