• Publicidad

Cómo imprimir datos de una línea en columna

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

Cómo imprimir datos de una línea en columna

Notapor davids84 » 2011-01-27 13:26 @601

Hola, ¿qué tal? Buen día. Quiero saber si me pueden asesorar en esto. Soy nuevo en el tema y carezco de conocimientos de Perl.

Tengo un fichero de este tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. >nombre
  2.  
  3.  numeros : 02037 00717 02101 02288 02289 02290 02314 02332 02333 02334 02336 02339 02340 02291 01435 02120 02102 02103
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y busque la forma de que mi salida fuera de este tipo

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. nombre 02037
  2.           00717
  3.           02101
  4.           02288
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo intenté hacer de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<$fh>)
  2. {
  3.         if ($_ =~ /^>(nombre\d+).*/)
  4.         {
  5.         $iso = $1;
  6.         }
  7.        
  8.                 if($_ =~ /^\s+numeros\s+:\s+(\d.+)Total:\n/) {
  9.                 print FILE "$iso\t$1\n";
  10.                 }
  11. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

pero no me da la salida adecuada ya que todos los dígitos los estoy poniendo en una sola variable y me lo imprime en una sola línea. Alguna forma de hacerlo para tener la salida adecuada...

¡¡¡Gracias!!!
davids84
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2011-01-27 13:14 @593

Publicidad

Re: Cómo imprimir datos de una línea en columna

Notapor pvaldes » 2011-01-27 13:40 @611

Primero conviértelo en una lista (usa split) y luego para cada elemento de "mi lista", menos el primero, imprimir "elemento" + \n. Tendrás que cortar la primera palabra de la lista (o sea, quitar "numeros :")
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Cómo imprimir datos de una línea en columna

Notapor davids84 » 2011-01-27 13:49 @617

¡¡¡Ok!!!... El split() es para eliminar espacios ¿verdad?

Muy bien, entonces probaré cual es el resultado...

¡¡Gracias!!
davids84
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2011-01-27 13:14 @593

Re: como imprimir datos de una linea en columna

Notapor pvaldes » 2011-01-27 14:30 @645

algo como esto, seguro que se puede hacer mejor

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $texto = 'numeros : 02037 00717 02101 02288 02289 02290 02314 02332 02333 02334 02336 02339 02340 02291 01435 02120 02102 02103';
  2. my @lista = split(' ', $texto);
  3. my @fuera = shift(@lista);
  4. my @fuera = shift(@lista);
  5. for ($i = 0; $i < $#lista + 1; ++$i){
  6. print "@lista[$i]\n"}
  7. ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


saludos
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Cómo imprimir datos de una línea en columna

Notapor davids84 » 2011-01-27 15:32 @689

¡aah!, Ok, perfecto... ¡¡¡me fuiste de mucha ayuda!!! Ya solo lo haré con un archivo grande... una pregunta: ¿podría poner algo así?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (my $fh, $ARGV[0]) or die "$!\n";
  2.  
  3. my $texto = <$fh>; #esto es lo que tu me sugeriste
  4.  
  5. my @lista = split (' ', $texto); #parte de tu código de sugerencia
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿¿¿Puedo hacer eso mismo para todo el archivo???

¿¿¿¿Me recomiendas hacerlo con un foreach() o con un while()????
davids84
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2011-01-27 13:14 @593

Re: Cómo imprimir datos de una línea en columna

Notapor pvaldes » 2011-01-28 06:05 @295

Yo lo haría así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. open (DATA, $ARGV[0]) or die "$!\n";
  3. my @lista = split(' ', <DATA>);
  4. for ($i = 2; $i < $#lista + 1; ++$i){print "@lista[$i]\n"};
  5. close DATA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


usar for o while depende de lo que quieras hacer con ese archivo, deberías tener claro lo que hace cada tipo de bucle, revisa el manual
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Cómo imprimir datos de una línea en columna

Notapor explorer » 2011-01-28 06:59 @333

Aunque en este caso sí se puede escribir @lista[$i], no es lo "correcto", que sería $lista[$i].

El porqué de la diferencia es una de las cuestiones en Cómo identificar a un buen programador de Perl.

Esta es mi solución. Dado el fichero de entrada
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>nombre

 numeros : 02037 00717 02101 02288 02289 02290

>nombre1

 numeros : 02037 00717 02101 02288 02289 02290

>nombre2

 numeros : 02037 00717 02101 02288 02289 02290
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y este programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. use File::Slurp 'slurp';
  6.  
  7. my $nombre;
  8.  
  9. for (slurp('kk.txt')) {                                 # para todas las líneas del fichero
  10.  
  11.     when (/^ > (?<nombre>\w+)/x) {                      # si la línea comienza por '>',
  12.         $nombre = $+{nombre};                           # tenemos el nombre
  13.     }
  14.  
  15.     when (/numeros \s* : \s*/x) {                       # si tenemos 'numeros : '
  16.         for my $numero (/(\d+)/g) {                     # para todos los números de la línea
  17.             printf "%-8s %s\n", $nombre, $numero;       # los pintamos formateados.
  18.             $nombre = '';                               # El nombre solo hay que pintarlo una vez
  19.         }
  20.     }
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
nombre   02037
         00717
         02101
         02288
         02289
         02290
nombre1  02037
         00717
         02101
         02288
         02289
         02290
nombre2  02037
         00717
         02101
         02288
         02289
         02290
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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: Cómo imprimir datos de una línea en columna

Notapor davids84 » 2011-01-28 09:30 @437

¡Aaah!, Ok... sí, es lo que iba a comentar de hecho... que sería mejor $lista[$i] porque cuando le pones el @lista, si no mal recuerdo marcaba un warning...

Entonces... tendré que aventarme un clavado al manual para saber cuándo utilizar cada bucle...

Pero espero con esta grandiosa ayuda de ambos tanto de pvaldes como explorer... de verdad ha sido de mucha ayuda... ya me abrieron más el panorama con sus aportaciones.

Disculpa, explorer... ¿Dónde puedo descargar las librerías que tu utilizaste? ¿O son de una versión más nueva de Perl? Lo que pasa es que yo tengo la versión 5.8.8 para Linux i386.

¿Hay manera de conseguirlas?

¡Saludos!
davids84
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2011-01-27 13:14 @593

Re: Cómo imprimir datos de una línea en columna

Notapor explorer » 2011-01-28 10:34 @482

La versión de perl v5.8.8 es del 1 de febrero del 2006, hace justo cinco años... es un poco antigua... Te recomiendo que te pases a un Perl más moderno.

Para instalar los módulos en Perl, se sigue un cierto orden.

El módulo autodie (salió en el 2008) sirve para capturar los fallos de ejecución en funciones como open(), read(), <> o close(), y salir del programa de forma inmediata, informando del fallo. Ahorra mucho código.

El módulo common::sense es lo mismo que poner:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 use utf8;
 use strict qw(vars subs);
 use feature qw(say state switch);
 no warnings;
 use warnings qw(FATAL closed threads internal debugging pack
                 portable prototype inplace io pipe unpack malloc
                 deprecated glob digit printf layer
                 reserved taint closure semicolon);
 no warnings qw(exec newline unopened);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es decir, activa avisos, desactiva otros (por ser demasiado pesados), activa la programación estricta (pero no tanto), activa la escritura utf8 y los nuevas características de Perl v5.10.

De mi solución, lo que uso de Perl v5.10 es el when(), que podrás cambiar en tu Perl viejito con un if().
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: Cómo imprimir datos de una línea en columna

Notapor davids84 » 2011-01-28 12:09 @548

¡Aaahh!, Ok, tienes razón... debería de actualizar... ya que como dices sí te ahorra mucho código... estoy comparando y la verdad sí es un número considerable de líneas las que te ahorras... en este momento estoy checando en la página de Perl para la actualización y hay un enlace que dice "Binaries Lastest". Di clic ahí y me abrió este enlace: http://www.activestate.com/activeperl/downloads (si puedes dar clic)
pero no veo ninguna opción que diga Linux 386, ¿¿puedo descargar la que solo dice X86?? ¿¿Esa sería la adecuada??

¡¡Saludos!!
davids84
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2011-01-27 13:14 @593

Siguiente

Volver a Básico

¿Quién está conectado?

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