[Perl] Retour à Perl - parser une sortie de commande multiligne
Nicolas
perl at escwq.fr
Sam 8 Fév 21:56:29 CET 2020
Bonsoir,
Après de (trop) nombreuses années à ne pas faire d'admin, je remets
(laborieusement) les mains dans le cambouis... et donc dans perl ;o)
Je n'ai jamais eu un niveau "gourou" en perl (même il y a 15ans) mais
j'arrive encore à écrire du code qui me donne le résultat attendu....
alors ça me convient ;o)
Mais du coup je vais peut-être avoir une question "bête" concernant le
traitement de la sortie d'une commande.
La commande fournit une sortie sur STDOUT que je stocke dans un tableau
via :
my @array=split(/\n/,`ma_super_commande_UNIX`) or die "error while
processing command \"ma_super_commande_UNIX\"";
Ensuite je fais une boucle pour parcourir le tableau et appliquer la
bonne regexp afin de récupérer les parties "ah-hoc" de chaque ligne et
les stocker dans un hash avec les bonnes clés.
La boucle est de la forme :
foreach my $scalar (@array)
{
if ( $scalar =~ m/VG IDENTIFIER:\s+(\S+)/ )
{
$hash{$stanza}{'VGid'}=$1;
}
}
En répétant les "if" dans la boucle (un "if" par ligne à traiter avec la
regexp associée) je peux matcher chaque ligne "qui va bien" par
exécution de la commande et ainsi récupérer les 2 valeurs par ligne qui
m'intéressent.
A la place du "if" j'ai essayé une notation de la forme :
($hash{$stanza}{'VGid'}, )=( $scalar =~ m/VG IDENTIFIER:\s+(\S+)/ );
Mais ceci a pour seul résultat de bien matcher la bonne ligne dans la
boucle, mais au "tour suivant" de la boucle (ligne suivante stockée dans
@array) alors la valeur est "mise à zéro", ceci sans doute car du coup
la regexp ne match pas ce qui est assez logique puisque ce n'est plus la
bonne ligne.
J'ai donc certainement loupé un truc quelque part.....
Je peux bien entendu garder ma ribambelle de "if" à l'intérieur de la
boucle mais..... je pense qu'il y a plus simple / plus perl et que je ne
suis pas loin..... :(
J'ai mis, un exemple de sortie de commande en fin de mail, je récupère
les 1 ou 2 valeurs par ligne pour stocker la 30aine de valeurs dans un hash.
Bonne soirée,
Nicolas
VOLUME GROUP: rootvg VG IDENTIFIER:
00f702be00004c0000000159122168ad
VG STATE: active PP SIZE: 128 megabyte(s)
VG PERMISSION: read/write TOTAL PPs: 799 (102272
megabytes)
MAX LVs: 256 FREE PPs: 21 (2688
megabytes)
LVs: 28 USED PPs: 778 (99584
megabytes)
OPEN LVs: 22 QUORUM: 2 (Enabled)
TOTAL PVs: 1 VG DESCRIPTORS: 2
STALE PVs: 0 STALE PPs: 0
ACTIVE PVs: 1 AUTO ON: yes
MAX PPs per VG: 32512
MAX PPs per PV: 1016 MAX PVs: 32
LTG size (Dynamic): 512 kilobyte(s) AUTO SYNC: no
HOT SPARE: no BB POLICY: relocatable
PV RESTRICTION: none INFINITE RETRY: no
DISK BLOCK SIZE: 512 CRITICAL VG: no
FS SYNC OPTION: no
Plus d'informations sur la liste de diffusion Perl