2010-01-06 11 views

Odpowiedz

21

Wolę korzystać z modułu Config::IniFiles.

+1

Config :: IniFiles to bardzo potężny menedżer INI. Dobra rekomendacja. – daotoad

9

Jeśli lubisz bardziej perlish styl spróbuj Tie::Cfg. Próbka:

tie my %conf, 'Tie::Cfg', READ => "/etc/connect.cfg"; 

$conf{test}="this is a test"; 
+1

Stosowanie remisu NIE jest zalecane przez "Najlepsze praktyki Perla". –

8

jest bardzo prosta i łatwa w użyciu.

$Config = Config::Tiny->read('file.conf'); 

my $one = $Config->{section}->{one}; 
my $Foo = $Config->{section}->{Foo}; 
9

Najlepszym sposobem jest wykorzystanie dostępnych modułów w CPAN, tak jak sugerowały inne. Poniżej jest tylko dla własnego zrozumienia, powiedzmy, że masz ini tak:

$ more test.ini 
[Section1] 
    s1tag1=s1value1    # some comments 
[Section2] 
    s2tag1=s2value1   # some comments 
    s2tag2=s2value2 
[Section3] 
    s3tag1=s3value1 

można zrobić własne parsowania w/o moduły przy użyciu tylko regex Perl (lub metody String) + struktury danych jak skrótów.

Przykładowy kod:

$ini="test.ini"; 
    open (INI, "$ini") || die "Can't open $ini: $!\n"; 
     while (<INI>) { 
      chomp; 
      if (/^\s*\[(\w+)\].*/) { 
       $section = $1; 
      } 
      if (/^\W*(\w+)=?(\w+)\W*(#.*)?$/) { 
       $keyword = $1; 
       $value = $2 ; 
       # put them into hash 
       $hash{$section} = [ $keyword, $value]; 
      } 
     } 
    close (INI); 
    while(my($k, $v) = each(%hash)) { 
     print "$k => " . $hash{$k}->[0]."\n"; 
     print "$k => " . $hash{$k}->[1]."\n"; 
    } 

wyjście

$ perl perl.pl 
Section1 => s1tag1 
Section1 => s1value1 
Section3 => s3tag1 
Section3 => s3value1 
Section2 => s2tag2 
Section2 => s2value2 
+1

Należy zauważyć, że ten analizator składni zachowuje tylko jedną parę klucz/wartość dla każdej sekcji. – Thelema

+0

Najlepsza praktyka Perla zaleca NIE używanie regex do odczytywania plików konfiguracyjnych, raczej używanie standardowych modułów z CPAN ... Dla plików ini: 'Config :: IniFiles'. –

1

nitpicking na powyższe:

Tie :: Cfg, jak pobrać z CPAN, nie obsługuje sekcje i klucze, które mogą mieć spacje w nich. Trzeba go zmienić, dodając cytaty (") wokół" kluczy "podczas ustawiania haszu dla sekcji i klawiszy w sekcjach. Pliki, które próbuję odczytać, zostały wygenerowane przez osoby z systemem MS Windows, a tym samym Mają dużo przestrzeni do obejrzenia:

Config :: Tiny, Config :: IniFiles są wybredne co do formatu.Jeśli jakaś linia nie ma postaci [section] lub key = val, rzucają błąd i można nie dostanie się do skrótów, które, przynajmniej w Config :: Files, są poprawnie wypełnione, dobrze byłoby mieć opcję ignorowania błędów, pliki, które próbuję odczytać, zawierają kilka niepoprawnych linii M4, że mogę przejść przez m4, aby się go pozbyć, ale nie jest to konieczne w tym, co próbuję zrobić z tym konkretnym skryptem.

0

czytanie i funkcję ini edycji plików napisać:

sub iniRead 
{ 
    my $ini = $_[0]; 
    my $conf; 
    open (INI, "$ini") || die "Can't open $ini: $!\n"; 
    while (<INI>) { 
     chomp; 
     if (/^\s*\[\s*(.+?)\s*\]\s*$/) { 
      $section = $1; 
     } 

     if (/^\s*([^=]+?)\s*=\s*(.*?)\s*$/) { 
      $conf->{$section}->{$1} = $2;   
     } 
    } 
    close (INI); 
    return $conf; 
} 
sub iniWrite 
{ 
    my $ini = $_[0]; 
    my $conf = $_[1]; 
    my $contents = ''; 
foreach my $section (sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$conf) { 
    my $block = $conf->{$section}; 
    $contents .= "\n" if length $contents; 
    $contents .= "[$section]\n" unless $section eq '_'; 
    foreach my $property (sort keys %$block) { 
     $contents .= "$property=$block->{$property}\n"; 
    } 
    } 
    open(CONF,"> $ini") or print("not open the file"); 
    print CONF $contents; 
    close CONF; 
} 

wykorzystanie próbki:

odczytu pliku conf i zapisywane do mieszania

$conf = iniRead("/etc/samba/smb.conf"); 

zmienić swój atrybut konfiguracyjny lub dodano nowe config atrybuty

edycja

$conf->{"global"}->{"workgroup"} = "WORKGROUP"; 

dodano nowe config

$conf->{"www"}->{"path"}="/var/www/html"; 

zapisać nową konfigurację do pliku

iniWrite("/etc/samba/smb.conf",$conf); 
+1

Po co na nowo odkrywać koło? – Toto

+0

być może programista nie ma dostępu do instalacji pakietu, a nie do konfiguracji lub użycia innego pakietu, a następnie używa funkcji do pracy. – mehrdad

Powiązane problemy