2010-08-10 3 views
10

Je dois créer un fichier YAML pour stocker des données de configuration pour un script Perl. Cela semble que ça devrait être vraiment facile mais je n'ai pas réussi à le résoudre, je pense que si j'avais juste un exemple simple à copier, ça irait. Je veux faire quelque chose comme ceci:Exemple simple d'utilisation des données d'un fichier de configuration YAML dans 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}; 
--------------------- 

Répondre

7

Essayez de vider la configuration que vous voulez.

use strict; 
use warnings; 

use YAML; 

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

print Dump(\%settings); 

Cette imprime

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

En outre, wikipedia a une bonne overview of YAML si la spécification est un peu trop dense.

+1

+1; Je le fais tout le temps depuis la ligne de commande: 'perl -MYAML :: Any -wle'my $ data = {quelques données ici}; print Dump ($ data) ''C'est aussi une bonne idée de désamorcer n'importe quel fichier de configuration que vous apportez et d'appeler Data :: Dumper par rapport à celui-ci, pour vérifier que vous avez fait les changements que vous aviez prévus. – Ether

+0

Je fais la même chose. Il est beaucoup plus facile pour moi d'obtenir le correctif initial de cette façon que si je recommence à zéro. –

+1

Bien que ce soit un bon moyen de créer un fichier de configuration YAML, il ne résout pas le problème qu'il a avec son code. Son YAML est réellement utilisable; c'est le code qui ne fonctionne pas. – cjm

16

Essayez ceci:

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

Merci! C'est parfait. – user416625

14

Votre problème fondamental est que Load attend une chaîne contenant YAML, pas un nom de fichier. Vous vouliez plutôt LoadFile (qui n'est pas exporté par défaut). En outre, vous devez utiliser YAML::XS au lieu de YAML si vous le pouvez, car c'est une meilleure implémentation. (Mais YAML devrait convenir pour un fichier de configuration simple.)

L'autre problème est que LoadFile renverra une référence de hachage (bien, si votre YAML ressemble à un hachage, comme le vôtre), pas une liste que vous pouvez utiliser initialiser un hachage.

Essayez ceci:

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

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

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

(Vous pouvez supprimer le ::XS si vous ne voulez pas (ou ne peut pas) installer YAML :: XS Le programme travaillera de concert avec aucun autre changement..)

+2

Pour les fichiers de configuration, je préfère YAML :: Tiny. –

Questions connexes