Print invisible dans le boucle while en Perl

Résolu/Fermé
farah - 7 janv. 2009 à 14:58
 farah - 7 janv. 2009 à 15:46
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];

2 réponses

Normal !!!!!!
($j = 0) vaut ... zéro ... donc ... la boucle n'est jamais exécutée ... CQFD ... Perl a toujours raison !
0
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
loupius > farah
7 janv. 2009 à 15:25
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
farah > loupius
7 janv. 2009 à 15:27
super, merci beaucoup pour ta réponse.
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
7 janv. 2009 à 15:27
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
Parce qu'il n'y en a pas!
0
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
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 > farah
7 janv. 2009 à 15:38
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
farah > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
7 janv. 2009 à 15:41
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
loupius > farah
7 janv. 2009 à 15:44
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