encore et encore du code pour la maitrise du truc

encore et encore du code pour la maitrise du truc - Perl - Programmation

Marsh Posté le 11-01-2004 à 19:05:24    

Bsoir a tous .. je continue mon entrainement  
 
Les resultats des commandes iostat et swap -s me produisent deux fichier qui sont comme consocpu et consomem
 
structure  
jj hh mm ss cpu ( mesure faite toutes les 30s )  
 
et  
jj hh mm ss mem  
 
je veux par jour  
cpu_moyen;cpu_max;mem_max  
et le code est le suivant  
 

Code :
  1. open(F1,"<$consocpu" );
  2. while(<F1> ) {
  3. ($jj,$h,$m,$s)=( (split(/ /,$_))[0],(split(/ /,$_))[1],(split(/ /,$_))[2],(split(/ /,$_))[3]);
  4. $inst=$jj.":".$h.":".$m.":".$s;         # jj:hh:mm:ss
  5. $conso{$inst} = (split(/ /,$_))[4];     # hash jj:hh:mm:ss  -> conso
  6. $cpt{$jj}++;    # comptage nombre de jj
  7. $cpu{$jj} += (split(/ /,$_))[4]; # Somme des conso pour jj identique
  8. }
  9. close(F1);
  10. $fmem = "$DONNEES/ConsoMem_$mois";
  11. open(FM,"$fmem" );
  12. while(<FM> ) {
  13. $dd=(split(/ /,$_))[0];   # jj
  14. $cptm{$dd}++;    # comptage du nombre de jj
  15. $cha=(split(/ /,$_))[4];  # taillmemk ( )
  16. $cha =~ s/.{1}$//;   # suppression du k en fin de chaine
  17. $mem{$dd} += $cha;   # somme de la meme pour jj identique
  18. }
  19. close(FM);
  20. foreach $jj (keys %cpt){
  21. @tab = sort {$conso{b} <=> $conso{a}} keys %conso ; # Tri decroissant de conso cpu par jj
  22. %max = ($jj => $conso{$tab[0]});           # hash jj -> conso max
  23. $moycpu = $cpu{$jj}/$cpt{$jj};    # cpu moyenne par jj ... somme(consocpu) / nb de jj
  24. chomp %max;
  25. $moymem = $mem{$dd}/$cptm{$dd}/1024;   # swap moyenne en Mo
  26. print "$jj -> $max{$jj} -> $moycpu -> $moymem\n";}


 
 
vous en pensez quoi ?

Reply

Marsh Posté le 11-01-2004 à 19:05:24   

Reply

Marsh Posté le 11-01-2004 à 22:20:17    

excuse moi mais tu code un peu comme un porc
 
- verifi toujours le resultat d'un open avec un || die, et met toujours les > ou <
- met des my, pasque réutiliser tout le temps les memes variables comme $jj, ca rend pas le truc tres clair. use strict!!
 
et c'est koi cette horreur :
    ($jj,$h,$m,$s)=( (split(/ /,$_))[0],(split(/ /,$_))[1],(split(/ /,$_))[2],(split(/ /,$_))[3]);  
 
??
 
pourkoi pas tout simplement
($jj,$h,$m,$s)= split(/ /,$_) (et avec un my devant)
 
de meme
   $inst=$jj.":".$h.":".$m.":".$s;
ce qui plus facilement si tu profite de l'interpolation des variables dans les doubles quotes:
   $inst= "$jj:$h:$m:$s";
 
ensuite tu utilise (split(/ /,$_))[4] deux fois, tu aurais mieux fait le le mettre dans une varible dans la primiere ligne de ta boucle, avec un nom qui indique ce que c'est
 
 
bon, ensuite dans ta derniere boucle tu fait:
  %max = ($jj => $conso{$tab[0]});            
ce qui a pour effet d'ecraser à chaque fois ce que %max contenait precedement, ce qui je pense n'est pas ce que tu cherche
 
donc tu déclare %max à l'exterieur de ta boucle avec un  
my %max = ();
 
puis dans ta boucle tu fait simplement:
$max{$jj} = $conso{$tab[0]};
 
et si tu veux chomper ta hash tu le fait apres ta boucle, sinon il va passer son temps à verifier des valeurs qu'il a deja chompé
 
bon à part ca je vois pas trop koi te dire: c'est difficile de comprendre ce que tu cherche à faire de la maniere dont c'est ecrit ici
 
désolé si je suis agressif, mais... tu sali perl mec! Si je te croise dans la rue je t'arrache le coeur et je le brule en l'honneur de Larry Wall (rappel moi de le faire à l'occasion)

Reply

Marsh Posté le 12-01-2004 à 00:54:11    

Ok merci pour tes remarques ...Et t inquiete j aime mieux les gens qui y vont franco....
Suis pas expert en programmation perl ..bref kk remaque  
je n'ai pas mis tout le code ds mon precedent message , mais j ai qd meme respecte les regle de prog comme la declaration des variable  
- Ce qui me gene ds le || die c que le programme s arrete et ca je ne le veux pas ...car je traite plusieur fichier..  
Pour le reste j ai reecrit kk lignes c en effet plus jojo

Reply

Marsh Posté le 12-01-2004 à 09:33:42    

pour le || die tu n'est pas obligé de mourrir, mais au moins tu peut afficher un message d'erreur avec warn et passer au fichier suivant plutot que d'essayer de lire depuis un fichier qui n'a pas été ouvert
 
ensuite pour tes variables il vaut mieux essayer de declarer tes variables le plus "localement" possible, pour etre certain qu'il n'y ai pas de conflit (par exemple une ancienne valeur qui n'a pas été initialisée)

Reply

Sujets relatifs:

Leave a Replay

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