[perl] Extraire la derniere ligne d'un fichie

Résolu/Fermé
fxta - 21 sept. 2009 à 16:26
 fxta - 22 sept. 2009 à 09:05
Bonjour, je souhaiterai tout simplement extraire la derniere ligne d'un fichier texte sachant que celui ci est de taille variable et que je ne connais aucun mot de la dernière ligne ni de celle d'avant.

J'ai essayé avec la fonction reverse :

open(FENT, '< logwls.txt'); 
foreach my $line (reverse(<FENT> )) { 
 print $line; 
} 
close(FENT);


Le $line me met bien ma derniere ligne en premier mais je n'arrive pas à extraire uniquement cette ligne.

ps : pour les curieux le fichier est de la forme

[info]balbalbalblablabalbalba
[info]balbalbalblablabalbalba
[info]balbalbalblablabalbalba
<2009-17-12 08h14><inbox><listenning on port xxxxxxx>
<2009-17-12 11h00><inbox><listenning on port xxxxxxx>
<2009-17-12 12h20><inbox><listenning on port xxxxxxx>


mais tres difficile d'utiliser les regex car aucun fichier ne se termine de la meme maniere.

Merci.
A voir également:

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 sept. 2009 à 17:22
Re,

Une autre méthode
#!/usr/bin/perl
use strict;use warnings;

open FENT, '< logwls.txt' or die "E/S : $!\n";;
chomp(my $derniere = (reverse(<FENT>))[0]);
print $derniere,"\n";
close(FENT);
__END__



3
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 sept. 2009 à 17:12
Salut,

Pas besoin des regex ;-)
lami20j@debian:~/trash/ccm_perl$ cat logwls.txt
info]balbalbalblablabalbalba
[info]balbalbalblablabalbalba
[info]balbalbalblablabalbalba
<2009-17-12 08h14><inbox><listenning on port xxxxxxx>
<2009-17-12 11h00><inbox><listenning on port xxxxxxx>
<2009-17-12 12h20><inbox><listenning on port xxxxxxx>
lami20j@debian:~/trash/ccm_perl$
lami20j@debian:~/trash/ccm_perl$ cat derniereligne.pl
#!/usr/bin/perl

open FENT, '< logwls.txt' or die "E/S : $!\n";;
foreach my $line (reverse(<FENT> )) {
         print $line and last; # je sors de la boucle après le 1er print
}
close(FENT);
__END__
lami20j@debian:~/trash/ccm_perl$
lami20j@debian:~/trash/ccm_perl$ perl derniereligne.pl
<2009-17-12 12h20><inbox><listenning on port xxxxxxx>

0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 sept. 2009 à 17:17
Re,

Et pour la récupérer

#!/usr/bin/perl
use strict;use warnings;
my $derniere;

open FENT, '< logwls.txt' or die "E/S : $!\n";;
foreach (reverse(<FENT> )) {
        chomp($derniere=$_) and last;
}
print $derniere,"\n";
close(FENT);
__END__


Exécution

lami20j@debian:~/trash/ccm_perl$ perl derniereligne.pl
<2009-17-12 12h20><inbox><listenning on port xxxxxxx>

0
Merci beaucoup lami20j. Petite préférence pour la derniere méthode, c'est exactement ce que je voulais !

Bonne journée.
0