2010-01-06 14 views

Respuesta

21

Prefiero usar el módulo Config::IniFiles.

+1

Config :: IniFiles es un administrador INI muy poderoso. Buena recomendación. – daotoad

9

Si te gusta el estilo más perlish luego tratar Tie::Cfg. Muestra:

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

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

Se recomienda NO utilizar el uso de corbata en "Mejores prácticas de Perl". –

8

Config::Tiny es muy fácil y sencillo de usar.

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

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

La mejor manera es hacer uso de los módulos disponibles en CPAN como lo han sugerido otros. A continuación es sólo para su propia comprensión, digamos que usted ha ini así:

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

usted puede hacer su propio análisis w/o módulos utilizando sólo expresiones regulares de Perl (o métodos de cadena) + estructuras de datos como hashes.

Código de ejemplo:

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

salida

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

Tenga en cuenta que este analizador solo mantendrá un par de clave/valor para cada sección. – Thelema

+0

Recomendaciones de mejores prácticas de Perl NO usar regex para leer archivos de configuración, en lugar de usar módulos estándar de CPAN ... Para archivos ini: 'Config :: IniFiles'. –

1

nitpicking en lo anterior:

Tie :: cfg, que también puede descargarse desde CPAN, no maneja secciones y claves que pueden tener espacios en ellos. Debe modificarse agregando comillas (") alrededor de las" teclas "al configurar las entradas hash para la sección y las claves dentro de las secciones. Los archivos que estoy tratando de leer fueron generados por gente de MS Windows, y por lo tanto tener un montón de espacios para todos.

Config :: Tiny, Config :: IniFiles son quisquillosos con el formato. Si alguna línea no es de la forma [sección] o clave = val, arrojan un error y uno puede Llegue a los valores hash, que, al menos en Config :: Files, se completan correctamente de todos modos. Sería bueno tener una opción de error de ignorar. Los archivos que estoy tratando de leer tienen algunas líneas falsas M4 en él, que podría ejecutar m4 para deshacerme de él, pero eso no es necesario en lo que estoy tratando de hacer con este script en particular.

0

la lectura y la función de archivo ini editar escribir:

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

ejemplos de uso:

archivo de configuración de lectura y guardado en Hash

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

cambio de la de su atributo de configuración o añadir una nueva configuración atributos

editar

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

añade nueva configuración

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

salvó su nueva configuración en un archivo

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

¿Por qué reinventar la rueda? – Toto

+0

quizás el desarrollador no tiene acceso para instalar el paquete o no configura o usa el otro paquete, luego usa la función para el trabajo. – mehrdad

Cuestiones relacionadas