[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