Citation :
Il ne fait que compter si la ligne 6 est égal ou différent de 0
|
Non. Pour chaque ligne, il regarde si le 6e champ vaut 0
J'ai pas testé, mais je ferais ainsi:
Code :
my $SEARCH_FILE = "billing_$mday-$mon-$year"; if (@bil > 0) { foreach my $file (@bil) { my ($i, $y) = (0, 0); while (<FILE> ) { # chomp; # mis en commentaire car probablement inutile (split(/;/, $_))[5]?++ $y:++ $i; } $Message = $Message . "$mday_hier/$mon_hier/$year_hier\t$y\t\t$i\n"; print "$mday_hier/$mon_hier/$year_hier;$y;$i\n"; } unlink join("\n", @bil), "\n"; # Je sais pas ce que vous voulez faire, mais c'est surement pas ça # si c'est pour supprimer les fichiers, un simple unlink @bil; suffit } else { print "ERROR: NO FILES\n"; print "ERROR: __END__\n\n"; # send email email_no_bil($To, $From, $Cc, $Bcc, $SubjectErr, $Message, $File); }
|
my $SEARCH_FILE = "billing_$mday-$mon-$year"; opendir(DIR, $DIR) or die "Can't open $DIR: $!"; my @bil = grep /$SEARCH_FILE/ readdir(DIR); closedir(DIR) or warn "Can't close $DIR: $!"; |
On ouvre le directory le plus tard possible, et on le ferme le plus tôt possible.
if (@bil > 0)
ça teste si l'array a des éléments ou non, et c'est lisible.
et on fait un else pour quand il n'y en a pas au lieu de faire if ($#bil == -1) ce qui est dangereux
while (<FILE> ) { # chomp; # mis en commentaire car probablement inutile (split(/;/, $_))[5]?++$y:++$i; } |
on va pas faire de (my $line = <FILE> ) et ensuite $_ = $line, car ça fait faire une copie complète de ligne à chaque fois (et en plus $_ n'est pas utilisé dans votre code)
On va juste faire (<FILE> ) et on aura donc chaque ligne directement dans $_
(split(/;/, $_))[5]?++$y:++$i;
On teste le 6e champ de la ligne, (split(/;/, $_))[5], obtenu donc en splittant la ligne sur ; et donc en évitant une coûteuse recopie dans un array
Si ce 6e champ est non nul, on incrémente $y, sinon, on incrémente $i.
C'est l'opérateur A?B:C qu'on retrouve dans tous les langages modernes, depuis le C.
Ça devrait accélérer le script.
NOTE: avec le test (split(/;/, $_))[5] si on a un 6e champ vide ;; ou bien absent (moins de 6 champs) il compte comme s'il valait 0.
Par contre un 6e champ avec 00 ou 0.0 compte comme s'il ne vaut pas 0
On peut se modifier le test en fonction du comportement voulu pour ces cas limites.
A+,
Message édité par gilou le 30-09-2011 à 01:46:54
---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --