1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| while (<>) {
# on lit ligne après ligne depuis l'entrée standard
my $line = $_;
# si c'est la premiere ligne, on la passe, il n'y a rien à faire dessus
if ($line =~ /^DATE/) { next; }
# sinon on commence par decouper la ligne en plusieurs parties (séparées par des espaces)
my @F = split(/[\s]+/, $line);
# on récupère jour, mois, année en appliquant une regex sur la partie 0 (la première partie de la ligne, la date donc)
# comme dit Lolo78 on cherche quelque chose qui ressemble à "2 chiffres/2 chiffres/4 chiffres"
my ($month,$day,$year) = $F[0] =~ m{^(..)/(..)/(.{4})$};
# dans le meme ordre d'idée on récupère heure, minutes, secondes, millièmes à partir de la partie 2 (troisième partie donc, l'heure et les millièmes de seconde)
# là encore on cherche un pattern du genre "2 chiffres:2chiffres:2chiffres.3chiffres"
my ($hour,$mins,$sec,$frac) = $F[2] =~ m{^(..):(..):(..)\.(.{3})$};
# on crée un timestamp "haute précision" pour donner à manger à tv_interval()
my $time = [timelocal($sec,$mins,$hour,$day,$month,$year) . "." . $frac];
# ici une astuce dégueu pour que la 1ere mesure vaille 0.000, en effet vu qu'on effectue une soustraction plus bas,
# si $prev valait 0, la première valeur serait le timestamp correspondant à "06/10/2014 15:34:17.765", une valeur très grande et fausse qui plus est
# donc on choisit de dire "si la variable $prev n'a pas encore de valeur, alors on lui affecte celle de $time", la soustraction donnera donc 0.000
$prev = $time unless defined($prev);
# enfin on substitue directement la partie 2 de la ligne par notre valeur
$F[2] = sprintf ("%.3f", tv_interval($prev, $time));
$prev = $time; # on oublie pas d'affecter $prev, qui au prochain tour de boucle aura la valeur de $time du tour précédent
# et on affiche toutes les parties de la ligne, avec un espace pour les séparer à chaque fois
print join(" ", @F)."\n";
} |
Partager