• Publicidad

Generar nombres y apellidos al azar

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

Generar nombres y apellidos al azar

Notapor anton73 » 2013-07-21 09:13 @426

Hola a todos,

tengo un problemilla de novato con Perl, a ver si alguien me puede echar una mano.

Tengo que hacer un programa que genere nombres y apellidos al azar y luego otro programa que lea el archivo donde se guardan los nombres y los cuente indicando por pantalla las veces que se repite cada uno.

Hasta aquí todo bien. El problema que tengo es que el nombre del archivo debe ser variable y el programa debe admitir que se le pasen los nombres tanto por nombre de archivo como por entrada estándar.

He leído varios manuales de Perl pero no soy capaz de dar con la tecla. ¿Alquién podría echarme una mano?

Gracias.
anton73
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-07-21 05:34 @273

Publicidad

Re: Generar nombres y apellidos al azar

Notapor explorer » 2013-07-21 10:00 @458

Bienvenido a los foros de Perl en Español, anton73.

Para el primer problema, hay un paquete que sirve precisamente para generar nombres al azar: Data-RandomPerson.

Para el segundo problema, para leer los archivos pasados en la línea de argumentos, como a través de la entrada estándar, no tienes que hacer nada: Perl por defecto abre los archivos indicados en la línea de argumentos, y se pueden leer de la misma manera que si fuera la entrada estándar.

Ejemplo, como argumento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -E 'while (<>) { print } ' archivo.txt
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Ejemplo, como entrada estándar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ cat archivo.txt | perl -E 'while (<>) { print } '
Coloreado en 0.001 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: Generar nombres y apellidos al azar

Notapor anton73 » 2013-07-21 11:13 @509

Muchas gracias, explorer, por tu rápida contestación.

Llevo pocos días con Perl y voy aprendiendo todo lo rápido que puedo, pero no me queda claro cómo usar los paréntesis angulares (<>).

He estado probando varias alternativas. En la primera me muestra los nombres y apellidos por pantalla pero no me dice cuántas veces se repite cada uno. En la segunda me abre el fichero donde están almacenados los datos... ¿Me podrías indicar cómo colocar el bucle while?

Este es el script que uso para contar los nombres. Gracias otra vez.

%cuantas_veces_sale;
open(LEER,"<nombres.txt");
while (my $nombre = <LEER>) {
chomp $nombre;
$cuantas_veces_sale{$nombre}++;
}
close(LEER);
for my $nombre (keys %cuantas_veces_sale)
{
print "$nombre : $cuantas_veces_sale{$nombre}\n";
}
anton73
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-07-21 05:34 @273

Re: Generar nombres y apellidos al azar

Notapor explorer » 2013-07-21 11:43 @529

Hola.

Lo primero y antes de que se me olvide: nuestro lenguaje se llama "Perl", no "PERL" (no es una sigla sino un nombre propio). También verás por ahí "perl", y en ese caso se refiere al propio programa intérprete.

Luego, en cuanto a tu programa que cuenta el número de veces que aparece cada nombre, a mí sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl programa.pl
Juan López-Rubio Fernández : 5
Pedro Ángel Castillo : 1
Joaquín Ferrero San Pedro : 4
Arturo González Ferrer : 3
Jordi Piqueras Brunet : 4
Guillermo Barturen Briñas : 1
Juan J. Merelo : 2
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En cuanto a la forma de colocar el while(), es idéntica a como lo tienes en el programa, salvo que no necesitas hacer ni un open() ni un close(). Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. while (<>) {
  3.     chomp;             # le quitamos el carácter de nueva línea a la línea leída
  4.     print "$. $_\n";   # sacamos un número de línea y el nombre leído
  5. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El operador diamante <> equivale a poner <STDIN>, que significa "leer un registro desde la entrada estándar". Otra forma de escribirlo es así: readline() (más información en perldoc -f readline).

P.D. Usa el marcado de sintaxis Perl para marcar tu código Perl dentro de estos mensajes. Queda más bonito y legible.
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: Generar nombres y apellidos al azar

Notapor anton73 » 2013-07-21 12:25 @559

Gracias de nuevo,
creo que ya lo he entendido.
anton73
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-07-21 05:34 @273


Volver a Básico

¿Quién está conectado?

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

cron