• Publicidad

Guardar una línea de un archivo de entrada en otro de salida

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Guardar una línea de un archivo de entrada en otro de salida

Notapor Tharanys » 2019-09-30 06:12 @300

Buenos días.

Soy nuevo en el mundo de la programación y quería pedir ayuda con la siguiente situación.

Tengo un archivo de entrada del que tengo que seleccionar unas líneas del archivo para guardarlas en otro.

Abro el archivo:

my $file = $ARGV[0];
unless (open(FROM,$file))
{
print STDERR "Cannot open file \"$file\"\n\n";
exit;
}

le digo que lo lea línea a línea y que me guarde el número de líneas y que cuando llegue a las que empiezan por '>' me las guarde, pero no soy capaz:

my $numerodelineas = 0;

while (<FROM>)
{
$numerodelineas++;
if ($numerodelineas =~ />/)
{
open (FILE_1,'>',"salida.txt")
print "$numerodelineas\n";
close (FILE_1)
}
}


Si podéis ayudarme os lo agradecería.
Tharanys
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2019-09-30 06:04 @294

Publicidad

Re: Guardar una línea de un archivo de entrada en otro de sa

Notapor explorer » 2019-09-30 08:47 @407

Bienvenido/a a Perl en Español, Tharanys.

El problema está en que la lectura de las líneas la haces a la variable por defecto ($_), pero luego no la usas para hacer la comparación. Mejor usar una variable explícita, y así se ve más claro el funcionamiento:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (FILE_1,'>',"salida.txt");              # abrimos el archivo resultado, en escritura
  2.  
  3. while (my $linea = <FROM>) {                 # leemos el archivo, por líneas; cada línea la guardamos en $linea
  4.     if ($linea =~ /^>/) {                    # si la $linea comienza (^) por '>'
  5.         print FILE_1 $linea;                 # imprimimos la $linea en FILE_1
  6.     }
  7. }
  8. close (FILE_1);                              # cerramos archivo resultado
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Fíjate que abrimos y cerramos el archivo resultado una sola vez, antes y después del bucle, no dentro de él. Si lo hiciéramos dentro, estarías sobreescribiendo el contenido anterior cada vez que encontrases una nueva línea.

Una vez entendido cómo se hace esto, Perl te permite escribirlo de forma más abreviada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (FILE_1,'>',"salida.txt");              # abrimos el archivo resultado, en escritura
  2.  
  3. while (<FROM>) {                             # leemos el archivo, por líneas; cada línea la guardamos en $_
  4.     if (/^>/) {                              # si la $_ comienza (^) por '>'
  5.         print FILE_1;                        # imprimimos la $_ en FILE_1
  6.     }
  7. }
  8. close (FILE_1);                              # cerramos archivo resultado
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La variable $_ (la de por defecto) nos permite realizar operaciones que la van a usar si no se indica ninguna otra variable.

Si estás empezando, mejor usa el primer método, y poco a poco vas pasando al segundo. Pero siempre que en el programa quede claro qué es lo que estás haciendo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Guardar una línea de un archivo de entrada en otro de sa

Notapor Tharanys » 2019-09-30 15:39 @693

Muchísimas gracias.

Ahora lo entendí y conseguí generar el archivo correcto de salida.

Mil gracias :)
Tharanys
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2019-09-30 06:04 @294


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados