¿Cuál es la mejor manera de analizar el archivo INI en Perl y convertirlo a hash?¿Cómo puedo acceder a los archivos INI desde Perl?
Respuesta
Prefiero usar el módulo Config::IniFiles.
Config :: IniFiles es un administrador INI muy poderoso. Buena recomendación. – daotoad
probar este módulo de CPAN: Config::INI::Reader
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";
Se recomienda NO utilizar el uso de corbata en "Mejores prácticas de Perl". –
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};
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
Tenga en cuenta que este analizador solo mantendrá un par de clave/valor para cada sección. – Thelema
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'. –
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.
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. ¿Cómo puedo acceder a los datos en muchos archivos CSV grandes rápidamente desde Perl?
- 2. ¿Cómo acceder a los archivos en Heroku?
- 3. ¿Puedo llamar a Perl desde python?
- 4. ¿Cómo puedo llamar a Perl desde Java?
- 5. Archivos App.config vs. .ini
- 6. Cómo acceder a archivos HTML desde ASP.NET MVC VIEWS Carpeta
- 7. ¿cómo puedo obtener los datos ini en pirámide?
- 8. Cómo resaltar "archivos ini" en Eclipse
- 9. ¿Cómo puedo acceder al archivo comprometido desde un enlace de precompilación de Subversion en Perl?
- 10. ¿Puedo acceder a una propiedad desde mi manifest.json en los archivos JavaScript de mi extensión?
- 11. ¿Puedo acceder a una cookie desde Socket.io?
- 12. ¿Cómo puedo distinguir dos archivos en Perl?
- 13. ¿Cómo gestiona los archivos de configuración en Perl?
- 14. ¿Cómo puedo enviar UTF-8 desde Perl?
- 15. Cómo acceder a los archivos en SVN usando java
- 16. ¿Cómo puedo acceder a los atributos y elementos de XML :: LibXML en Perl?
- 17. Cómo acceder a los archivos locales dentro del proyecto
- 18. ¿Cómo acceder a los valores de usercontrol desde la página?
- 19. ¿Cómo puedo combinar archivos PDF con Perl?
- 20. ¿Cómo puedo acceder a mi servidor localhost desde otras computadoras?
- 21. Usando varios archivos Eclipse ini
- 22. ¿Cómo puedo acceder a los archivos s3 en Python usando urls?
- 23. ¿Cómo puedo acceder a los elementos de iframe con Javascript?
- 24. ¿Cómo podemos acceder a los mensajes de archivos en aplicaciones para Android desde un servidor XMPP
- 25. ¿Cómo uso Github para acceder a los mismos archivos de proyecto desde diferentes computadoras?
- 26. Cómo acceder a los archivos ODB en Python 2.7
- 27. Cómo acceder a los servicios SOAP desde el iPhone
- 28. ¿Cómo puedo pasar argumentos comunes a los módulos de Perl?
- 29. ¿Cómo puedo crear XML desde Perl?
- 30. ¿Cómo puedo acceder a los iconos de vista previa de archivos de Windows desde mi aplicación WPF?
La mejor manera es buscar en CPAN (http://search.cpan.org). :) –