Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1584 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Optimisation?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Perl] Optimisation?

n°1062214
mc40
Posté le 27-04-2005 à 09:10:19  profilanswer
 

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

mood
Publicité
Posté le 27-04-2005 à 09:10:19  profilanswer
 

n°1062293
pospos
Posté le 27-04-2005 à 10:03:46  profilanswer
 

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');

n°1062307
mc40
Posté le 27-04-2005 à 10:16:23  profilanswer
 

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!

n°1062314
Elmoricq
Modérateur
Posté le 27-04-2005 à 10:20:05  profilanswer
 

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

n°1062384
pospos
Posté le 27-04-2005 à 10:50:28  profilanswer
 

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

n°1062511
mc40
Posté le 27-04-2005 à 11:42:55  profilanswer
 

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 ?
}

n°1063885
mc40
Posté le 28-04-2005 à 09:53:17  profilanswer
 

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 ??

n°1063920
Elmoricq
Modérateur
Posté le 28-04-2005 à 10:04:38  profilanswer
 

"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:

n°1064637
mc40
Posté le 28-04-2005 à 17:54:01  profilanswer
 

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

n°1064669
mc40
Posté le 28-04-2005 à 18:37:54  profilanswer
 

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!!!!
 
 
 
 
 
 

mood
Publicité
Posté le 28-04-2005 à 18:37:54  profilanswer
 

n°1065307
mc40
Posté le 29-04-2005 à 08:58:31  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Optimisation?

 

Sujets relatifs
certificats SSL + [ Coldfusion ou Perl ][Perl] Question toute bête?
[ Perl ] conversion HEXA => ASCIIPerl + html
[PERL]Est-ce possible de ne pas faire attention à la case?[perl] connaitre la classe d'un objet
obtenir mon adresse IP en PerlExtension PHP/PERL
gif anime en PERL TK[Perl] Optimisation
Plus de sujets relatifs à : [Perl] Optimisation?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR