Petit soucis

Petit soucis - Perl - Programmation

Marsh Posté le 20-02-2007 à 15:54:11    

Bonjour,
 
je voudrais faire un truc du genre
 
on a par exemple $x = 2;
si je fais :
$y = '$x';
un print $y; affichera $x
 
ensuite je vourdais arriver à récupérer la valeur 2 en utilisant $y, quelqu'un saurrait comment faire svp ?
 
Vous allez me demander pourquoi je veux faire ça.
C'est un peu compliqué à expliquer.
J'ai une certaine variable et il faudrait que je concatène le nom de cette variable avec une chaine, puis évaluer le résultat.
Enfait j'ai un truc du genre:
 
 $v = '$data->{regleracine}->{warning}->{regle}';
 $v = $v . '->{warning}->{regle}';
 
ensuite il faudrait que je puisse évaluer la valeur de $data->{regleracine}->{warning}->{regle}->{warning}->{regle}.
Je fais cette concaténation car je dois ajouter ->{warning}->{regle} à chaque fois et vérifier si c'est null ou si on peut encore continuer.
Donc à la fin on peut se retrouver avec n * ->{warning}->{regle}.
 
Je ne suis pas sûr d'avoir été clair mais ma question revient à savoir comment récupérer la valeur de $x avec $y, si $y = '$x'.
 
PS: Je suis débutant en programmation  :)

Reply

Marsh Posté le 20-02-2007 à 15:54:11   

Reply

Marsh Posté le 20-02-2007 à 16:02:45    

http://perl.enstimac.fr/DocFr/perlfunc.html#item_eval
 
Mais ça sent pas bon ce que tu essaye de faire [:pingouino]
 
Pourquoi tu fais pas directement:

Code :
  1. $valeur = $data->{regleracine}->{warning}->{regle}->{warning}->{regle};


???

Reply

Marsh Posté le 20-02-2007 à 16:31:52    

Ba parce que je ne sais pas jusqu'où ça va.
je peux arriver à $data->{regleracine}->{warning}->{regle}->{warning}->{regle}->{warning}->{regle}->{warning}->{regle}->{warning}->{regle}->{warning}->{regle}->{warning}->{regle}.
 
Enfait j'ai utilisé XML::Simple pour récupérer le contenu d'une arborescence d'un fichier xml, dans $data.
Il faut que je parcours toute l'arborescence et à chaque règle qui descend d'une autre règle, il faut que je renvois le nom de la règle (il y a aussi deux cas: alerte ou warning).


Message édité par MaT77 le 20-02-2007 à 16:32:18
Reply

Marsh Posté le 20-02-2007 à 16:50:57    

Pourquoi tu te fais pas un petit truc recursif qui parcourerait ta hash?
 
Par ailleurs je te conseillerais d'acheter du goudron et des plumes pour gentillement en enduire la personne qui a pensé la structure du flux xml qui tu as l'air de devoir utilisé!

Reply

Marsh Posté le 20-02-2007 à 17:05:53    

HAHA
Devine qui a pensé à la structure du fichier xml !
Ba c'est moi !
J'ai créé un fichier d'exemple:
 

Citation :


<regleracine nom="r0">
  <alerte>
    <message>execution des regles r1 et r2</message>  
    <regle nom="r1">
      <alerte>
        <regle nom="r12" />  
      </alerte>
      <warning>
        <regle nom="r13">
          <alerte>
            <regle nom="r20" />  
          </alerte>
        </regle>
      </warning>
    </regle>
    <regle nom="r2">
      <alerte>
        <regle nom="r14" />  
        <regle nom="r30" />  
      </alerte>
      <warning>
        <regle nom="r5">
          <alerte>
            <regle nom="r25" />  
          </alerte>
        </regle>
      </warning>
    </regle>
  </alerte>
  <warning>
    <message>execution de la regle r1</message>  
    <regle nom="r1">
      <alerte>
        <regle nom="r12" />  
      </alerte>
      <warning>
        <regle nom="r7">
          <alerte>
            <regle nom="r40" />  
          </alerte>
        </regle>
      </warning>
    </regle>
  </warning>
</regleracine>


 
Quoi vous avez dit indigeste ?  :D  
Y a peu être des truc modifiable mais je ne vois pas ce que je pourrais changer à la structure.
 
Je veux bien faire un truc récursif mais je ne sais pas comment lol.

Reply

Marsh Posté le 20-02-2007 à 17:52:28    

Ok j'imagine que ta structure décrit la liste des vérifications de règles, règles composées de sous-règles pouvant elles-même être composée de sous-sous-règles et ainsi de suite; Chaque règle pouvant remonter une alerte ( mot français) ou un warning (mot anglais, c'est bien uniforme :o) .
Par contre aucun de des noeuds n'a de valeur s'normal?
 
Après pour le récursif, l'idée c'est grosso modo de faire une fonction qui prend une hash en paramètre et regarde si elle a une clé que tu cherches si oui tu rappeles cette même fonction avec la "sous-hash" qui est la valeur de la clé recherchée.
2/3 recherches devraient te permettre de trouver rapidement des exemples
 
note: oui je pourrais te filer un code tout fait, il y en a pour 2 secs mais cela perdrait de son interêt pédagogique.

Reply

Marsh Posté le 20-02-2007 à 20:24:19    

Ok merci.
Mais pour répondre: non tu ne pourrais pas me donner un code tt fait car tu ne sais pas ce que je veux faire :).
C'est plus compliqué que les quelques informations que j'ai donné.
Pour les alerte et warning, j'avais pas le choix c'est comme ça.
 
sub Parcourt($arbo)
{
  if ($arbo ne undef)
  {
    .............
    .............
    $arbo .= '{alerte}->{regle}';
    $v = eval $arbo;
    Parcourt($v);
  }
}
 
Bon pour la syntaxe perl je ne maitrise pas encore mais ça devrait ressembler à ça.
Sinon c'est ça l'idée pour le récursif ? En gérant les cas alerte ou warning biensur.
Par contre une fois qu'on est arrivé à la fin de l'arbre (qd $arbo est null), comment on fait pour remonter d'un cran dans l'arborescence?

Reply

Marsh Posté le 21-02-2007 à 09:51:35    

c'est bien ça!
Mais pourquoi tu veux remonter? En l'occurence c'est l'execution de la fonction va continuer, donc si tu mets quelque chose après l'appel à Parcourt dans ta fonction Parcout, il sera executé dès la fin de Parcourt.
Ptain je suis super pas clair [:pingouino]

Reply

Marsh Posté le 21-02-2007 à 16:49:14    

Ok merci, c'est bon j'ai résolu mon problème.
 
Par contre, il y a quelque chose que je voudrais faire :
Enfait il va y avoir un répertorie contenant plusieurs fichiers xml, comme celui que j'ai montré.
J'aimerais ouvrir le répertoire, le parcourir et tanque qu'il y a des fichier, ouvir le premier fichier, faire $xml = new XML::Simple; $data = $xml->XMLin("nomfichier.xml" );
Puis retourner dans la boucle, ouvrir le deuxième fichier et refaire $xml = new XML::Simple; $data = $xml->XMLin("nomfichier.xml" );
 
Et ainsi de suite, sans connaître d'avance le nom des fichiers à ouvrir bien sûr.

Reply

Marsh Posté le 22-02-2007 à 18:10:33    

[:pingouino] oui enfin la lecture d'un repertoire c'est :
* soit les bases
* soit 30 secondes pour trouver dans la doc hein  
=> opendir/readdir
 
A noter que tu peux aussi trouver des modules sur la cpan qui font ça très bien avec plein d'options en plus

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed