Print invisible dans le boucle while en Perl
Résolu
farah
-
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];
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
-
Normal !!!!!!
($j = 0) vaut ... zéro ... donc ... la boucle n'est jamais exécutée ... CQFD ... Perl a toujours raison !-
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- 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.
-
-
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 écrirewhile ($j==0)
mais je ne vois pas la condition d'arrêt de la boucle
-
-
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 -
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 -
-
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é ?
-