[Perl] Optimisation?

Optimisation? [Perl] - Perl - Programmation

Marsh Posté le 27-04-2005 à 09:10:19    

Voici mon petit script j'ai le résultat que je voulai
mais certainement qu'il y a plus rapide avec le grep
mais j'ai pas compris comme ça marché si quelqu'un
peut me montrer une petit optimisation de ce code ??
 
#! /usr/bin/perl
# -*- mode: Perl -*-
#use SNMP_util '1.0
use SNMP_util "1.04";
 
 
@var = snmpwalk ('192.168.0.200', '1.3.6.1.2.1.10.7.2.1.1');
print "var avant = @var\n";
foreach $index (0 .. @var){
 #@var2 = @var[$index];
 chop(@var[$index]);
 chop(@var[$index]);
 chop(@var[$index]);
 #print "var=@var[$index]";
 
}
print "var apres = @var\n";
 
résultat:
var avant = 11:11 12:12 13:13 14:14 15:15 16:16 17:17 18:18 19:19 20:20
21:21 22:22 23:23 24:24 25:25 26:26 27:27 28:28 29:29 30:30 31:31 32:32
33:33 34:34 35:35 36:36 37:37 38:38 39:39 40:40 41:41 42:42 43:43 44:44
45:45 46:46 47:47 48:48 49:49 50:50 51:51 52:52 53:53 54:54 55:55 56:56
57:57 58:58 59:59 60:60
 
var apres = 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53  
 54 55 56 57 58 59 60

Reply

Marsh Posté le 27-04-2005 à 09:10:19   

Reply

Marsh Posté le 27-04-2005 à 10:03:46    

use strict; !
 

Code :
  1. use strict;
  2. use SNMP_util "1.04";
  3. my @var = map {/(\d+)/} snmpwalk ('192.168.0.200', '1.3.6.1.2.1.10.7.2.1.1');

Reply

Marsh Posté le 27-04-2005 à 10:16:23    

yep Salut pospos LE Monsieur Perl ;)
 
Bon je viens de voir un truc c'est que mon code ne marche pas pour des valaur de type 1:1 2:2 etc!!! le con!!
 
Bon je vais tester ton code et juste un truc pourquoile use strict?
ensuite pourquoi le my ?
voila à trép vite a mon avis.
et encore en grand merci d'un néophyte du perl!

Reply

Marsh Posté le 27-04-2005 à 10:20:05    

mc40 a écrit :

Bon je vais tester ton code et juste un truc pourquoile use strict?
ensuite pourquoi le my ?


 
 
"use strict" pour te forcer à écrire du code propre, et surtout pour éviter les possibles erreurs de fonctionnement qui ne seraient pas détectées sans ça.
Bref, c'est propre un "use strict".
 
Le "my" est essentiel avec "use strict" car, avant d'utiliser une variable, il faut la déclarer. Sinon, ça sort en erreur. Encore une fois, c'est bien plus propre de faire ainsi.
 
Ne pas oublier que :
1. Ce qui peut passer pour un programme d'une centaine de lignes devient vite imbitable dès que le programme grandit, même pour le concepteur du-dit programme ;
 
2. Par voie de conséquence, tout ce qui peut alléger la maintenance, améliorer la lisibilité et la structure du programme DOIT être utilisé. :)
 
Pour ton programme, je zieute ça... au retour de réunion. :D

Reply

Marsh Posté le 27-04-2005 à 10:50:28    

exac
j'ajouterais meme qu'un petit "use warnings;" n'est pas non plus deplaisant. C'est comme un use strict (mais ce ne le remplace pas, il faut mettre les deux) en plus chiant encore (et parfois tellement chiant qu'on est obligé de lui dire "no warnings;" dans certaines portions de code), mais souvent tres salutaire.
 
Pour le code que je t'ais filé il marchera quelque soit le nombre de chiffres

Reply

Marsh Posté le 27-04-2005 à 11:42:55    

en effet car je met le use strict j'ai pas mal d'erreur je vais voir ça de suite apres bon voici mon code pratiquement final car j'ai un soucis au niveau de mon compteur car le ifnumber compte les interfaces virtuel (vlan..) et mon FSCerror de s'applique pas aux vlan donc je vais trop loin dans la MIB mais je vais trouver une autre variable je pense
j'ai plusieur fonctions je vais les mettre nikel et apres j'ai d'autres questions!!!
 
*********************************************
#! /usr/bin/perl
use strict;
use SNMP_util "1.04";
 
$i = 1;
$IP = '192.168.0.202';
 
@oid_FCSerror = (1,3,6,1,2,1,10,7,2,1,3);
 
 
$ifsysDescr = snmpget ($IP,'1.3.6.1.2.1.1.1.0');
print "$ifsysDescr\n\n";
 
$ifNumber = snmpget ($IP, '1.3.6.1.2.1.2.1.0');
print "ifnumber= $ifNumber\n";
 
my @FCS_index = map {/(\d+)/} snmpwalk ($IP, '1.3.6.1.2.1.10.7.2.1.1');
 
while($i <= $ifNumber){
 push(@oid_FCSerror,@FCS_index[($i-1)]);
 @oid_FCS_ok = join('.',@oid_FCSerror);
 my $FCSerror = snmpget ($IP,@oid_FCS_ok);
 print "FCS error= $FCSerror\n";  
 $i++;
===>@oid_FCSerror = (1,3,6,1,2,1,10,7,2,1,3);
===>#ou alors pop(@oid_FCSerror); c'est peut-etre mieux ?
}

Reply

Marsh Posté le 28-04-2005 à 09:53:17    

Bon finalement j'ai choisi le pop lol
et un autre truc vous pouvez m'expliquer le map :map {/(\d+)/} car c un peut obscure pour moi ??

Reply

Marsh Posté le 28-04-2005 à 10:04:38    

"map bloc liste" évalue "bloc" pour chaque élément de "liste".
 
Ici, bloc = "/(\d+)/", ce qui représente une sélection du premier nombre de la chaîne.
 
Donc, pour chaque élément du tableau, map ne retiendra que le premier nombre trouvé.
 
Je ne sais pas si je suis clair.  :sweat:

Reply

Marsh Posté le 28-04-2005 à 17:54:01    

oui merci je bataillerai sur ça plus tard car je vous prépare un de ces bugs!!!!

Reply

Marsh Posté le 28-04-2005 à 18:37:54    

alors je vais donc résumer ma situation:
j'interroge un routeur il me renvoit le compteur de FCSerror donc tout vat bien!!
Première étape de passée deuxième truc il faut que je stoke tout ça dans un fichier txt!
 
Mes fichiers text ont se format:
 
<Thu Apr 28 16:49:50 2005> 192.168.0.1  FCS_error=0  FCS_index=11
<Thu Apr 28 16:49:50 2005> 192.168.0.1  FCS_error=0  FCS_index=12
<Thu Apr 28 16:49:50 2005> 192.168.0.1  FCS_error=0  FCS_index=13
<Thu Apr 28 16:49:50 2005> 192.168.0.1  FCS_error=0  FCS_index=14
 
Maintenant je vous explique le cheminement du prog qui me génère ces fichiers. Il y a un fichier par jour et leurs noms sont de type jour-moi-année. Le fichier du jour est un fichier FILS et le fichier d'hier un fichier PERE. Je vais vous décrire le fonctionnement de mon prog depuis le début c a d il n'y a aucun fichier!
 
1=> j'init la variable $file avec le nom du fichier du jour. J'ai donc une fonction &get_nom_fichier_fils qui me retourne le nom du fichier du jour dans la variable $file voici le code:
 
sub get_nom_fichier_fils{
 print "coucou ici filston\n";
 ($seconde,$minute,$heure,$jour,$mois,$annee,$wday,$yday,$isdst) = localtime(time);
 $annee += 1900;
 $mois++;
 $file = "$jour-$mois-$annee";
 print"file=$file\n";
}
 
Les print sont la pour le debugage!!
 
2=> J'ouvre le fichier du jour grace à :
 
if( 1 == open(FIC,"$file" )){
 @buffer_fils = <FIC>;
}
 
S'il existe il me le charge dans @buffer_fils donc tout est ok.
 
mais si le fichier n'existe pas car tout simplement c'est la premiere fois que l'on exec le script ou alors on vient de changer de jour et le script n'a pas été lancé depuis, alors je traite l'erreur en recherchant un fichier père!!!
 
else{
print "Erreur pas de fichier fils! Recherche d'un fichier père\n";
 &get_nom_fichier_pere;
 if( 1 == open(FIC,"$file" )){
  print "Fichier père trouvé\n";
  @buffer_pere = <FIC>;
  close(FIC);
  &set_fichier_fils;
 }
S'il y a un fichier on charge son contenu dans @buffer_pere mais si il n'existe pas alors je crée par defaut un fichier père et un fichier fils.
 
else{
 print "Aucun fichier de sauvegarde!! Création du fichier père!.\n";
   
  &get_nom_fichier_fils;
  &get_FCS_error;
  &get_nom_fichier_fils;
  open (FIC,"$file" );
  @@buffer_fils = <FIC>;
  close(FIC);
  print "Fichier fils=\n@buffer_fils\n";  
   
  &get_nom_fichier_pere;
  &get_FCS_error;
  &get_nom_fichier_pere;
  open (FIC,"$file" );
  @buffer_pere = <FIC>;
  close(FIC);
  print "Fichier père=\n@buffer_pere\n";
 
 
 }
 
Mon gros problème ce situe de la deuxième partie du else juste au dessus.
Le print "Fichier fils=\n@buffer_fils\n"; est OK il me retourne bien le contenu mais mon print "Fichier père=\n@buffer_pere\n";
ne me retourne rien du tout!!!! PK je ne sias pas!!! le c'est que si j'intervertis le code comme cela:
 
else{
 print "Aucun fichier de sauvegarde!! Création du fichier père!.\n";
 
  &get_nom_fichier_pere;
  &get_FCS_error;
  &get_nom_fichier_pere;
  open (FIC,"$file" );
  @buffer_pere = <FIC>;
  close(FIC);
  print "Fichier père=\n@buffer_pere\n";
 
  &get_nom_fichier_fils;
  &get_FCS_error;
  &get_nom_fichier_fils;
  open (FIC,"$file" );
  @buffer_fils = <FIC>;
  close(FIC);
  print "Fichier fils=\n@buffer_fils\n";
 }
 
Cette fois c'est de contraire Le print "Fichier prer=\n@buffer_pere\n"; est OK il me retourne bien le contenu mais mon print "Fichier fils=\n@buffer_fils\n"; ne me retourne rien du tout!!!!
POURQUOI!!!!!!!!!!!!
 
je vous met mon code en entier pour plus de clartée:
 
#! /usr/bin/perl
use strict;
use SNMP_util "1.04";
my $i = 0;
my $IP = '192.168.0.1';
my @oid_FCSerror = (1,3,6,1,2,1,10,7,2,1,3);
my $seconde;
my $minute;
my $heure;
my $jour;
my $mois;
my $annee;
my $wday;
my $yday;
my $isdst;
my $maintenant;
my @FCS_index;
my @buffer_fils;
my @buffer_pere;
my $file;
my $cpt;
my $FCSerror;
my @oid_FCS_ok;
my $z=0;
my @mc;
 
 
&get_FCS_error_index;
&get_nom_fichier_fils;
if( 1 == open(FIC,"$file" )){
 @buffer_fils = <FIC>;
 
}
else{
 print "Erreur pas de fichier fils! Recherche d'un fichier père\n";
 &get_nom_fichier_pere;
 if( 1 == open(FIC,"$file" )){
  print "Fichier père trouvé\n";
  @buffer_pere = <FIC>;
  close(FIC);
  &set_fichier_fils;
 }
 else{
  print "Aucun fichier de sauvegarde!! Création du fichier père!.\n";
   
  &get_nom_fichier_fils;
  &get_FCS_error;
  &get_nom_fichier_fils;
  open (FIC,"$file" );
  @mc = <FIC>;
  close(FIC);
  print "Fichier fils=\n@mc\n";  
   
  &get_nom_fichier_pere;
  &get_FCS_error;
  &get_nom_fichier_pere;
  open (FIC,"$file" );
  @buffer_pere = <FIC>;
  close(FIC);
  print "Fichier père=\n@buffer_pere\n";
 
 
 }
 
}
 
sub set_fichier_fils {
 &get_nom_fichier_fils;
 open(FIC,">$file" );
 &get_FCS_error;
 close(FIC);
}
sub get_FCS_error {
 open(FIC,">>$file" );
 while($i < $cpt) {
  push(@oid_FCSerror,@FCS_index[$i]);
  my @oid_FCS_ok = join('.',@oid_FCSerror);
  my $FCSerror = snmpget ($IP,@oid_FCS_ok);
  pop(@oid_FCSerror);
  print FIC"<",scalar localtime,"> $IP  FCS_error=$FCSerror  FCS_index=@FCS_index[$i]\n";
  $i++;
 }
 close(FIC);
}
 
sub get_FCS_error_index {
 @FCS_index = map {/(\d+)/} snmpwalk ($IP,'1.3.6.1.2.1.10.7.2.1.1');
 $cpt = scalar @FCS_index;
}
 
sub get_nom_fichier_fils{
 print "coucou ici filston\n";
 ($seconde,$minute,$heure,$jour,$mois,$annee,$wday,$yday,$isdst) = localtime(time);
 $annee += 1900;
 $mois++;
 $file = "$jour-$mois-$annee";
 print"file=$file\n";
}
sub get_nom_fichier_pere{
 print "coucou ici papa\n";
 ($seconde,$minute,$heure,$jour,$mois,$annee,$wday,$yday,$isdst) = localtime(time);
 $annee += 1900;
 $mois++;
 $jour = ($jour - 1);
 $file = "$jour-$mois-$annee";
 print"file=$file\n";
}
 
Pour le comparaison des FCSerror on attendra un peut!!!!
 
 
 
 
 
 

Reply

Marsh Posté le 28-04-2005 à 18:37:54   

Reply

Marsh Posté le 29-04-2005 à 08:58:31    

Bon je me remet au taff voyons voir si je trouve ma bourde!!!!

Reply

Sujets relatifs:

Leave a Replay

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