2010-08-10 25 views
10

Necesito crear un archivo YAML para almacenar algunos datos de configuración para un script Perl. Parece que debería ser realmente fácil, pero no he podido resolverlo, creo que si tuviera solo un ejemplo simple para copiar estaría bien. Quiero hacer algo como esto:Ejemplo simple de uso de datos de un archivo de configuración YAML en un script Perl

-----test.yaml----- 
image_width: 500 
show_values: 0 
------------------- 

------test.perl------ 
use YAML; 

my (%settings) = Load('test.yaml'); 
print "The image width is", $settings{image_width}; 
--------------------- 

Respuesta

7

Intente eliminar la configuración que desee.

use strict; 
use warnings; 

use YAML; 

my %settings = (
     foo => 1, 
     bar => [qw/one two three/], 
); 

print Dump(\%settings); 

Esto imprime

--- 
bar: 
    - one 
    - two 
    - three 
foo: 1 

Además, Wikipedia tiene un buen overview of YAML si la especificación es un poco demasiado denso.

+1

+1; Lo hago desde la línea de comandos todo el tiempo: 'perl -MYAML :: Any -wle'my $ data = {algunos datos aquí}; print Dump ($ data) '' También es una buena idea desarmar cualquier archivo de configuración que hagas y llamar a Data :: Dumper contra él, para verificar que realizaste los cambios que pretendías. – Ether

+0

Hago lo mismo. Es mucho más fácil para mí obtener el archivo inicial correcto de esta manera que si empiezo desde cero. –

+1

Si bien esta es una buena forma de crear un archivo de configuración YAML, no soluciona el problema que tiene con su código. Su YAML es realmente utilizable; es el código que no funciona. – cjm

16

Prueba esto:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use YAML qw(LoadFile); 

my $settings = LoadFile('test.yaml'); 
say "The image width is ", $settings->{image_width}; 

- Michael

+0

¡Gracias! Eso es perfecto. – user416625

14

Su problema fundamental aquí es que Load espera una cadena que contiene YAML, no un nombre de archivo. En su lugar, quería LoadFile (que no se exporta por defecto). Además, debe usar YAML::XS en lugar de YAML si puede, ya que es una mejor implementación. (Pero YAML debería ser adecuado para un archivo de configuración simple.)

El otro problema es que LoadFile devolverá una referencia hash (bueno, si su YAML parece un hash, como la suya), no es una lista que puede usar para inicializar un hash

Prueba esto:

use strict; 
use warnings; 
use YAML::XS qw(LoadFile); 

my $settings = LoadFile('test.yaml'); 

print "The image width is ", $settings->{image_width}; 

(puede eliminar el ::XS si no quiere (o no puede) instalar YAML :: XS El programa funcionará con ningún otro cambio.).

+2

Para los archivos de configuración prefiero YAML :: Tiny. –

Cuestiones relacionadas