Print invisible dans le boucle while en Perl

Résolu
farah -  
 farah -
Bonjour,

j'ai fait un script en Perl qui vas lance une boucle qui utilise un snmpwalk . Je ne comprends pas pourquoi les print à l'intérieur de la boucle while ( while ($j=0){) ne s'affichent pas, alors que quand je la supprime j'ai le résultats suivant:

voip ~ # ./test_RTT1.pl
UCD-SNMP-MIB::ucdavis.52.101.1 = STRING: "17"

le RTT est de : "17"

la valeur 1500 est eliminee, on a un RTT de taille 1
la moyenne du RTT est de :17

Ci-dessous mon script:
#!/usr/bin/perl
#$i=0;
$j = 0;

while ($j=0){
sleep 5;

#system ("/usr/bin/snmpwalk -c public -v 1 192.168.0.13 .1.3.6.1.4.1.2021.52.101.1");
$SNMP = `/usr/bin/snmpwalk -c public -v 1 192.168.0.13 .1.3.6.1.4.1.2021.52.101.1`;
print "$SNMP\n";
@RTT1 = split (/ /, $SNMP);
$RTT = @RTT1 [3];
print "le RTT est de : $RTT \n";
@cols = split (/"/, $RTT);
if (@cols[1] != 1500){
push (@RTTf, @cols[1]);
}

$sizef = scalar @RTTf;
print "On a $sizef valeurs de RTT \n";
$moyenne=0; }

$moyenne = $moyenne / $sizef;
print "la moyenne du RTT est de :$moyenne \n";

}

Quelqu'un comprend pourquoi les print ne s'affichent pas?
for ($i = 0; $i < $sizef; $i++){
$moyenne = $moyenne + @RTTf[$i];
Configuration: Linux
Firefox 3.0.3

2 réponses

  1. loupius
     
    Normal !!!!!!
    ($j = 0) vaut ... zéro ... donc ... la boucle n'est jamais exécutée ... CQFD ... Perl a toujours raison !
    0
    1. farah
       
      merci loupius pour ta réponse. C'est mon premier script en Perl donc j'ai un peu de mal à comprendre.
      Pour moi au contraire vu que $j=0, la boucle while est toujours vraie et donc elle s'execute continuellement.
      Qu'est ce que je dois faire pour corriger ce problème?

      Merci
      0
      1. loupius > farah
         
        Utiliser l'opérateur d'égalité au lieu de l'opérateur d'assignation, à savoir:
        while ($j == 0)
        Ce qui ne veut pas dire qu'en Perl il ne faut jamais utiliser l'opérateur d'assignation dans un while, au contraire, par exemple:
        open (FICHIER, "nomFichier");
        while ($ligne = <FICHIER>)
        {
           ...
        }
        Tout à fait correct, et même très Perlien.
        0
      2. farah > loupius
         
        super, merci beaucoup pour ta réponse.
        0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    @RTT1 = split (/ /, $SNMP);
    $RTT = @RTT1 [3];


    Ce n'est pas plutôt ?
    @RTT1 = split (/ /, $SNMP); 
    $RTT = $RTT1 [3]; 

    Tu peux aussi écrire au lieu de
    @RTT1 = split (/ /, $SNMP);
    $RTT = @RTT1 [3];
    tout simplement
    $RTT = (split / /, $SNMP)[3]; 
    Pareil

    @cols = split (/"/, $RTT); 
      if ($cols[1] != 1500){ 
      push (@RTTf, $cols[1]); 
    } 


    Tu peux écrire
    while ($j==0)
    mais je ne vois pas la condition d'arrêt de la boucle

    0
    1. loupius
       
      Parce qu'il n'y en a pas!
      0
    2. farah
       
      Merci lami20j pour ta réponse.
      En fait $RTT = $RTT1 [3]; et $RTT = @RTT1 [3]; revient au même j'ai essayé avec les deux.
      Sinon j'ai testé while ($j==0) et les print s'affichent maintenant c'est super.

      C'est juste la boucle while ne s'arrête pas j'ai oublié de mettre la condition d'arrêt.

      Merci beaucoup pour ton aide
      0
    3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > farah
       
      Re,

      Oui, je sais que ça marche, mais il faut apprendre être un peu discipliné en Perl.

      Mais après le shebang use strict;use warnings; et tu auras des surprises ;-)

      Ensuite pourquoi utiliser un tableau quand tu peux récuperer la variable avec
      $RTT = (split / /, $SNMP)[3]; 

      Mais bon, c'est juste l'histoire d'avoir un tableau qui n'est pas vraiment nécessaire
      0
    4. farah > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
       
      re,

      Ah je saivais pas qu'on pouvais récuperer la variable avec $RTT = (split / /, $SNMP)[3], comme j'ai dit c'est mon premier programme je suis pas une pro:)
      Bref merci bcp pour ces infos:)
      0
    5. loupius > farah
       
      Ca marche peut-être, mais ce n'est pas pour ça que c'est correct; si ça marche c'est parce que Perl, sur ce coup-là, est très conciliant.
      Lami20j a raison, il vaut mieux mettre:
      $RTT = $RTT1 [3];
      car nous sommes dans un contexte scalaire.
      Dans l'autre cas:
      @RTT1 [3] équivaut à ($RTT1 [3]), j'ai mis des parenthèses car nous sommes dans un contexte de liste que Perl va ensuite transformer en un contexte scalaire puisque assigné à $RTT.
      Vu la subtilité ?
      0