2012-03-29 8 views
5

Sto creando uno script Perl che deve leggere e ottenere i valori di un file INI.Perl: Iterating attraverso i file INI

INI File Format:

[name] 
Property=value 

Esempio:

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

Come si può vedere, non ci può essere qualsiasi quantità di sezioni, che contengono un numero qualsiasi di parametri. I nomi dei nomi/parametri delle sezioni saranno sempre diversi.

Quello che devo fare è far scorrere il mio script Perl in ogni sezione e ottenere tutti i nomi/i valori dei parametri di quella sezione. Quello che mi sono abituato a fare con i file INI viene semplicemente specificando il nome della sezione insieme al nome del parametro in questo modo:

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

Tuttavia, ora che ho una quantità indefinita di sezione Nomi/parametri, come pure come non conoscendo i loro nomi, non riesco a capire un modo per estrarre tutti i valori. Stavo guardando il modulo Config :: IniFiles, e ha alcune cose interessanti, ma non riesco a trovare un modo per ottenere un valore di parametro senza conoscere il nome della sezione/parametro.

Se qualcuno mi può aiutare con l'iterazione di questo file INI, sarebbe molto apprezzato.

Grazie.

risposta

6

È possibile fare ciò che si desidera con Config::Tiny. È sufficiente utilizzare la funzione keys per iterare su tutte le chiavi di hash, come segue:

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

Nota: Perché hash sono "hash", e non ordinato come gli array sono, l'ordine delle chiavi restituito può sembra insensato. Poiché l'ordine non è rilevante in un file INI (solo il posizionamento di quali parametri sono in quale sezione è importante), questo non dovrebbe essere un problema.

+0

Grazie mille, questo è esattamente quello che stavo cercando. – user1300922

5

Personalmente preferisco Config::Simple. Puoi chiamare il suo metodo param() senza argomenti per restituire tutti i parametri dal tuo file. Ha anche alcune altre caratteristiche interessanti su Config::Tiny.

+0

+1 per le offerte CPAN. – Zaid

2

Capisco che tu sia soddisfatto dell'analisi dei file ini. Se si desidera solo per scorrere tutte le sezioni & loro-coppie di chiavi poi

È possibile scorrere Hash-Of-Hash come questo.

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

Funziona perfettamente. Grazie :) – user1300922