[PERL] table de hash de tableaux d'un tableau

Fermé
Ochman Messages postés 9 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 10 juin 2008 - 12 juin 2007 à 10:38
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 12 juin 2007 à 14:32
Bonjour

Je suis nouveau sur le forum.
Je suis actuellement en stage de fin de première année de bts IRIS.


Dans le cadre de ce projet, je suis ammené a vérifier le bon déroulement de la compilation d'assemblages.

j'ai un programme perl qui lance une commande d'assemblage, celle ci s'exécute identifie chaque source de l'assemblage, les compiles, crée les packetages .epkg , les installes avant de compiler l'assemblage en lui même et d'en créer le packetage.

cette commande renvoie sur STDOUT et SDTERR un ensemble d'informations que je traite ligne a ligne afin de savoir quelle source est traitée de quel assemblage ( avec les différentes versions) et a quel stade en est le traitement.

je souhaiterai créer un tableau qui comporterait les assemblages principaux en values (dont le nom est contenu par des variables et dont le nombre est variable d'une exécution a l'autre du programme perl)
et je souhaiterais que ces values renvoient à des tableaux repertoriant les sources en values (dont le nom est contenu par des variables et dont le nombre est variable d'une exécution a l'autre du programme perl) et que ces values renvoient a une table de hash dont les clefs seraient les suivantes avec les values suivantes représentant lesdiférents stades:


Assembly => Not Engaged / Engaged / Ok
Build => Not Engaged / Engaged / Ok
Package => Not Engaged / Engaged / Ok
Install => Not Engaged / Engaged / Ok




je ne sais pas si je suis tres clair :

-------------------EXEMPLE------------------------------------------
si je compile le projet calculette 1.0 (sources : calc1.0 mult1.0 et add1.0) et calculette 1.1 (sources : calc1.1 mult1.0 et add1.0 soust1.0)


on aurait un @Assemblies
[0] | calculette_1.0
[1] | calculette_1.1

et

seraient crées

un @calculette_1.0
[0] | mult_1.0
[1] | add_1.0
[2] | calc_1.0

un @calculette_1.1

[0] | mult_1.0
[1] | add_1.0
[2] | soust_1.0
[3] | calc_1.1

et les tables de hash

%mult_1.0
Assembly => Ok
Build => Ok
Package => Ok
Install => Ok

%add_1.0
Assembly => Ok
Build => Ok
Package => Engaged
Install => Not Engaged

et ect avec toutes les sources (ici sept)


l'idée est que je puisse par la suite dans le programme accéder a l'information en disposant des éléments suivant :

quelle est l'état du packaging de la source add1.0 de l'assemblage calc1.10 (ici "Engaged)


####################################

En plus simple et en résumé je souhaite accéder à une valeur qui dépend de trois paramètres (assemblage, source, stade)
sachant que le nombre d'assemblages varie leur nom aussi, idem pour les sources seul le nom et les valeurs des stades reste les même d'un éxécution a l'autre.

je dispose de variable contenant les noms des assemblages des sources et les versions et je ne voit pas comment créer des tableaux et des tables de hash dynamiquement

Merci de votre aide

8 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 11:18
Salut,

je ne sais pas si je suis tres clair :
Ici tu as raison :-)) ce n'est pas vraiment claire

cette commande renvoie sur STDOUT et SDTERR un ensemble d'informations que je traite ligne a ligne
J'ai besoin de savoir ce que tu as sur STDOUT et STDERR, et ce que tu dois obtenir comme résultat final
Merci.
0
Ochman Messages postés 9 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 10 juin 2008
12 juin 2007 à 12:54
stderr est redirigée vers sdtout et le tout est lié a EBUILD

my $Comand = "ebuild -b $BuildDir -B release -n $Prog -v $Version 2>&1" ; 	#the ebuild comand witch will build and install the project

    print "\nRunning: $Comand\n";

if ( !  open EBUILD, "$Comand |")
{
....
}



Extrait de ce que j'ai a traiter
checking for strip... strip
checking for nm... nm
checking if make is GNU make... yes
checking for dependency tracking method... gcc
configure: creating ./config.status
config.status: creating Makefile
OK
add--1.0: running build
(cd build && make)
make[1]: Entering directory `/home/expand/Desktop/ExpandLauSeb/Expand/log/sources/add--1.0/projects/add/unix/build'
./bk-deps g++ -c -o add10_add.o -I../../../../cpp/pinclude -I../../../../cpp/include -DUNIX -DLINUX -fPIC -DPIC  -O3 -Wall -Wno-sign-compare -D_UNIX ../../../../cpp/src/add.cpp 


mon algo de traitement des lignes (extrait)
if ( !  open EBUILD, "$Comand |")	#execute the comand $Comand and link ebuild sdtout with the EBUILD filehandle
    {
        die "Cannot open the ebuild filehandle : $!";
    }
    my $ctxt = {};

	
    while ( defined($Line = <EBUILD>)) 
    {	
        chomp($Line);
        
        if ( $Line =~ /^building assembly/i ) #call the handle witch manage the assembling
        {
            handle_what_it_assembly($ctxt, $Line);
        }
           
        
        if ( $Line =~ /running build$/i ) #call the handle witch manage the building
        {
            handle_building($ctxt, $Line);
        }
        
        if ( $Line =~ /running package$/i ) #call the handle witch manage the packaging
        {
            handle_packaging($ctxt, $Line);
        }
        
        if ( $Line =~ /^Installing packages/i ) #call the handle witch look at the package wich is installed
        {
            handle_installing($ctxt, $Line);
        }
       
        if ($Line =~ /^OK$/i )	#store the result of the build in a hash table($BuildReport) 
        {
            handle_build_ok($Line);
        }
	
        if ( $Line =~ /Package successfully installed/i ) #print the install result  g
        {   
            handle_success_inst($Line);
        }
    
        if ($Line =~ /error/i) #call the handle witch manage the errors
        { 
            handle_error($Line);
        }
    
        if ($Line =~ /^EBUILD : FAILED$/i)  #call the handle witch manage the builds failures
        {   
            handle_build_FAILED($ctxt,$Line);
        }
    
    
        $ctxt->{MostPreviousLine} = $ctxt->{PreviousLine};  #store the previous and the most previous lines
        $ctxt->{PreviousLine} = $Line;
    }

    close EBUILD;	#close the filehandle LOGFILE








Ensuite les sous fonctions traitent l'affichage écran pour que l'utilisateur ai un "résumé" de ce qui s'est passé lors de la compilation. afin de savoir dans quel ordre se sont déroulées les étapes d'assemblage et si elles se sont bien déroulées .

je souhaite par la suite pour d'autres fonctionnalité de ce programme pouvoir accéder à l'état d'avance ment de chacune de ces étapes (Engaged, Not Egaged, Ok)en fonction de trois paramètres :

_l'étape d'avancement concernée (assembly, build, package, install)
_le ficher source (versionné) auquel il correspond
_l'assemblage auquel le fichier source appartient

0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 13:11
D'accord, tu me montre ton algo, mais il utilise des fonctions dont je n'ai pas le code

Ce que j'avais besoin ce n'était pas ton algo mais ce que tu veux obtenir en sortie.

Donc j'ai l'entrée (en fin une partie)
checking for strip... strip
checking for nm... nm
checking if make is GNU make... yes
checking for dependency tracking method... gcc
configure: creating ./config.status
config.status: creating Makefile
OK
add--1.0: running build
(cd build && make)
make[1]: Entering directory `/home/expand/Desktop/ExpandLauSeb/Expand/log/sources/add--1.0/projects/add/unix/build'
./bk-deps g++ -c -o add10_add.o -I../../../../cpp/pinclude -I../../../../cpp/include -DUNIX -DLINUX -fPIC -DPIC -O3 -Wall -Wno-sign-compare -D_UNIX ../../../../cpp/src/add.cpp


mais pas la sortie

En bref il me faut un cas concret :-) de sortie pour un cas concret d'entrée.
Merci.

0
Ochman Messages postés 9 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 10 juin 2008
12 juin 2007 à 13:35
le truc c'est que ça va etre dur de te décrire ce que fait chacune des fonction parce que c'est un oeu compliqué a expliquer le tout du tout donc jvai essayer de t'aiclairer en te donnant ce que je souhaite que fasse en plus les fontions :

dans une variable $prog j'ai le nom de l'assemblage a compiler et sa version dans $Version;


handle_what_it_assembly -> me stocke dans une variable le nom de la source en train d'être traitée ainsi que sa version elle dit a l'utilisateur que l'assemblage de cette source de cette version a démaré
j'aimerai quelle me stocke dans une table de hash la valeur "Engaged" pour l'étape Assembly et "Not Engaged" pour les étapas build package et install de cette meme source de cette meme version

handle_building ->elle dit a l'utilisateur que la compilation de cette source de cette version a démaré
j'aimerai quelle stocke dans une table de hash la valeur "Engaged" a la place de "not Engaged" pour l'étape Build

handle_packaging->elle dit a l'utilisateur que la création des packets de cette source de cette version a démaré
j'aimerai quelle stocke dans une table de hash la valeur "Engaged" a la place de "not Engaged" pour l'étape Package

handle_installing->elle dit a l'utilisateur que l'installation du packet cette source de cette version a démaré
j'aimerai quelle stocke dans une table de hash la valeur "Engaged" a la place de "not Engaged" pour l'étape Installed

handle_build_ok->elle dit a l'utilisateur que la dernière étape engagée était un succès, cad que si (pour la source et la version concernée) l'étape assembly est "Engaged" et l'étape build est "not Engaged" elle met l'étape assembly a "ok" a la place de "Engaged"



handle_success_inst->fait la meme chose que handle_build_ok mais avec l'étape install (elle est différente a détecter)

handle_build_failed et error ne nous interressent pas ici




merci de m'aider je sais que je suis pas tres clair mais c'est que je m'y perd un peu dans le programme en ce moment ;)



edit: pour l'instant tout sort a l'écran par l'intermédiaire du shell et ce traitement se fait ligne a ligne, des qu'un ligne est traitée le programme affiche le résultat mais ne le stocke pas je souhaite stocker toutes les étapes afin de pouvoir les traiter plus tard ou dans d'autres fonctions du programme.je vai uploaded un exemple de fichier contenant stderr et stdout et le rendu que j'ai actuellement



http://ochmanboss.free.fr/Screenshot.png -> sortie de mon programme
http://ochmanboss.free.fr/LogFileOK.txt -> EBUILD (stderr et stdout)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 13:43
Je crois que on s'est mal compris

Je n'ai pas besoin de savoir ce qu'elle font tes fonctions, quoique ça me donne une idée de la façon dont tu traites ton problème

Ce que j'ai besoin c'est de résultat que tu dois obtenir et pas comment tu penses l'obtenir.
Donc un cas concret et pas les variables que tu crées pour traiter ton problème.

Merci.
0
Ochman Messages postés 9 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 10 juin 2008
12 juin 2007 à 13:54
ce que je doit obtenir c'est le moyen d'accéder (a nimporte quel moment de l'éxécution du programme ) a un listing de ce qui c'est passé pour chaque assemblage, cad que par exemple a un moment si j'ai besoins de reprendre toutes ces information pour les stocker dans une base de donnée sql afin d'effectuer des statistique de compilation pour afficher sur une page web.Donc je veu pouvoir stocker toutes les informations de compilation de l'assemblage dans des variables pour les rendre facilement accecible. afin de pouvoir les traiter.
0
Ochman Messages postés 9 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 10 juin 2008
12 juin 2007 à 14:13
je croi que j'ai trouvé je te tiens au courant
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 14:32
Salut,

tant mieux si tu as trouvé, ça m'evitera de travailler :-))
0