Lun Jul 28, 2008 4:57 pm
|
 |
teco000
Perlero Nuevo

|
Registrado: 29 May 2008
Mensajes: 33
Ubicación: Guatemala
|
|
| Recorrer fichero |
|
|
| Saludos, con una molestia, tengo mi programa que recorre un fichero pero ahora necesito que no tome en cuenta la última línea. ¿Cómo lo puedo hacer? |
|
|
|
Lun Jul 28, 2008 5:22 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
|
|
|
|
|
Esta es una forma (no especialmente bonita).
| Perl: | #!/usr/bin/perl
use strict;
use warnings;
open FICHERO, "<kk.txt";
my $linea;
my $linea_anterior;
while ( $linea = <FICHERO> ) {
if ( $linea_anterior ) {
# Procesa la línea anterior
print "$linea_anterior\n";
}
$linea_anterior = $linea;
}
close FICHERO; |
|
|
Lun Jul 28, 2008 5:48 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
Yo usaría la función eof() para verificar el final del archivo, y un last para salir del while.
| Perl: | #!/usr/bin/perl -w
use strict;
open my $FILE, '<', 'kk.txt' or die $!;
while ( my $linea = < $FILE> ) {
last if eof($FILE); #si es la última línea sale del while
print $linea;
}
close $FILE; |
|
|
Lun Jul 28, 2008 6:02 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
|
|
|
|
|
¡Ja! Se me olvidaba otra... el modo 'chupador'.
| Perl: | #!/usr/bin/perl
use File:: Slurp;
my @lineas = read_file ('kk.txt');
foreach my $i ( 0 .. $ #lineas - 1 ) {
print "$lineas[$i]\n";
} |
|
|
Mar Jul 29, 2008 8:12 am
|
 |
teco000
Perlero Nuevo

|
Registrado: 29 May 2008
Mensajes: 33
Ubicación: Guatemala
|
|
|
|
|
| Gracias, a ambos, me son de mucha ayuda |
|
Jue Ago 07, 2008 9:50 am
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
Suenan bien los ejemplos, pero ¿cómo sería al revés? ¿que solo se imprimiera la última línea, sin usar slurp? |
|
Jue Ago 07, 2008 10:38 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
|
|
|
|
|
| Pues... fácil... vas leyendo el fichero, línea a línea. Cuando se llega al final del fichero, sale del bucle. En ese momento, el valor de la variable que iba almacenando las líneas leídas contendrá la última línea leída. |
|
Jue Ago 07, 2008 12:03 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
mmm A ver, comprendo lo de línea a línea pero al final te imprime, el contenido neto.
Primero abro el archivo. Lo meto a un @database, para después hacer un foreach, pero no comprendo eso de al final, no puedo mandar un print fuera de las { }. Entonces, ¿cómo se obtendría la última lectura?
| Perl: | #!/usr/bin/perl
use strict;
use warnings;
open FICHERO, "<t.txt" or die "No se pudo localizar el archivo... \n";
my @database = <FICHERO>;
close(FICHERO );
foreach my $linea (@database)
{
print "$linea\n";
} |
|
|

Jue Ago 07, 2008 12:18 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
|
|
|
|
|
Justo has dado con la solución de en medio... es decir... no has encontrado la solución...
Una manera es empezar como has hecho tu:
| Perl: | #!/usr/bin/perl
use strict;
use warnings;
open FICHERO, "<t.txt" or die "No se pudo localizar el archivo... \n";
my @database = <FICHERO>;
close(FICHERO ); | pero, entonces, si tienes todo el fichero leído en @database, entonces la última línea está en $database[-1].
Y la otra forma, la comentada antes es ir leyendo línea a línea:
| Perl: | #!/usr/bin/perl
use strict;
use warnings;
my $linea;
open FICHERO, "<t.txt" or die "No se pudo localizar el archivo... \n";
while ( $linea = <FICHERO> ) {
}
close(FICHERO );
print $linea; |
Darse cuenta de que $linea está definida fuera del bucle, para que podamos referirnos a ella también fuera, después del bucle. |
|

Jue Ago 07, 2008 12:45 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
OK, comprendo la primera, y sale el resultado pero la segunda ¿¿seguro que está bien?? porque era lo que te comentaba que te da un error
| Código: |
| Use of uninitialized value in string at linea2.pl line 10 |
porque está fuera de las { }
 |
|
Jue Ago 07, 2008 12:57 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
|
|
|
|
|
A mí sí que me funciona... porque uso while() en lugar de foreach().
El porqué... ya respondida antes. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|