Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Recorrer fichero

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Lun Jul 28, 2008 4:57 pm
teco000
Perlero Nuevo
Perlero Nuevo
Registrado: 29 May 2008
Mensajes: 33
Ubicación: Guatemala
Recorrer fichero Responder citando

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?
Mensaje Lun Jul 28, 2008 5:22 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

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;
Mensaje Lun Jul 28, 2008 5:48 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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;
Mensaje Lun Jul 28, 2008 6:02 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

¡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";
}
Mensaje Mar Jul 29, 2008 8:12 am
teco000
Perlero Nuevo
Perlero Nuevo
Registrado: 29 May 2008
Mensajes: 33
Ubicación: Guatemala
Responder citando

Gracias, a ambos, me son de mucha ayuda
Mensaje Jue Ago 07, 2008 9:50 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Suenan bien los ejemplos, pero ¿cómo sería al revés? ¿que solo se imprimiera la última línea, Question sin usar slurp?
Mensaje Jue Ago 07, 2008 10:38 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Jue Ago 07, 2008 12:03 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

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";
}
Mensaje Jue Ago 07, 2008 12:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Jue Ago 07, 2008 12:45 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

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 { }

Question
Mensaje Jue Ago 07, 2008 12:57 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

A mí sí que me funciona... porque uso while() en lugar de foreach().

El porqué... ya respondida antes.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group