• Publicidad

Contar duplicados y mostrar número

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

Contar duplicados y mostrar número

Notapor gonzalos » 2009-11-29 17:34 @773

Hola a todos

Soy nuevo en Perl y estoy intentando hacer un programa que lea de la entrada estándar, lo guarde en un archivo, lea el archivo y señale qué nombres se repiten.

Algo así como esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Perez Pedro
Gonzalez Rodrigo
Perez Pedro
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y obtener una salida como sigue:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Perez Pedro 2
Gonzalez Rodrigo 1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Estoy bloqueado y no sé cómo continuar; he estado mirando en el foro y en Internet y no me termino de aclarar. Este es el código que he hecho:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "Escribe cinco apellidos y nombres\n";
print "Cuando termines pulsa Ctrl+Z\n";
my @nombres=<STDIN>;
open (ENTRADA,">c:/perl/entrada.txt\n");
print ENTRADA @nombres;
open (SALIDA,">c:/perl/salida.txt\n");
        if ($nombres[0] eq $nombres[1]){
                print SALIDA @nombres;
}
close (ENTRADA);
close (SALIDA);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Tengo problemas con la estructura de control, no sé cómo definirla. ¿Alguien tiene alguna idea de cómo continuar?

Gracias y un saludo.
Gonzalo
Última edición por explorer el 2009-11-29 20:54 @912, editado 1 vez en total
Razón: Ortografía
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Publicidad

Re: Contar duplicados y mostrar número

Notapor explorer » 2009-11-29 21:20 @931

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

Tu programa resuelve muy poco del problema, pues no sigue el guión que tu mismo debes seguir. Te aconsejo que traduzcas, línea a línea, tu guión, a código Perl. Por ejemplo, veo que no lees de ningún fichero: estás escribiendo en los dos.

Para el tema de contar secuencias repetidas, en vez de usar un arreglo, te aconsejo que uses un arreglo asociativo (hash), porque es precisamente lo que tratamos de resolver: recordar si un nombre ya ha salido o no.

Por estos foros hay multitud de ejemplos de códigos que hacen lo que pides en tu programa. Te aconsejo que empieces por ver los Tutoriales y la sección de básico. Usa también el sistema de búsqueda o Google ajustado a este sitio, para localizar código.

En cuanto a las estructuras de control, tienes varias opciones.

Si quieres leer del usuario 5 nombres, pues, por ejemplo, entonces puedes hacer un bucle de justo esa cantidad:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (1 .. 5) {
  2.     # Leer la entrada estándar y guardar en disco
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Una vez que hayas terminado de leer la entrada del usuario, cierras los ficheros con close(), y abres el fichero recién creado (con "<fichero") y vas leyendo línea a línea. Por cada línea, la almacenas en el arreglo asociativo, incrementando en 1 el número de veces que la has visto. Finalmente, haces un bucle recorriendo las claves de ese arreglo (que serán los nombres leídos) y muestras al lado de cada uno de ellos las veces que aparecen (que es el valor almacenado por cada clave, en el arreglo asociativo).

¡Inténtalo!
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: Contar duplicados y mostrar número

Notapor gonzalos » 2009-11-30 04:28 @227

Hola, Explorer.

Ahora que me lo has comentado me he dado cuenta de que estaba escribiendo en los dos. Gracias por la guía. Lo sé, debo ser más ordenado al hacer un programa.

He buscado en Google y en el foro. Y he visto algunos ejemplos, pero el código que se usa, en la mayoría de los casos se escapa todavía a mi "cuasi" nulo entendimiento de Perl.

Estoy muy verde, pero espero en uno o dos años conseguir hacer mis propios programas de forma decente.

Seguiré tus consejos y reestructuraré el código, a ver cómo me queda. No te preocupes que lo seguiré intentando hasta que lo consiga. Además, pienso que esa es la mejor manera de aprender.

Os mantendré informados.

Un saludo y gracias por la ayuda.
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Contar duplicados y mostrar número

Notapor explorer » 2009-11-30 06:39 @319

¿Uno o dos años?

Aprender Perl te llevará un par de tardes, al menos la parte de sintaxis :) Otra cosa es aprender todas posibilidades que esa sintaxis te es capaz de ofrecer.

No dudes en poner aquí todas las dudas. Publica el código que vayas haciendo y comentas donde te atascas, y te iremos dando pistas y/o soluciones.

Mira lo que pasó en el hilo Diario de aprendizaje de un perlero desde cero.
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: Contar duplicados y mostrar número

Notapor visualfree » 2009-11-30 14:17 @637

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2. open(DATOS,"entrada.txt");
  3. @registro=<DATOS>;
  4. for($i=0;$i<=4;$i++)
  5. {
  6.         print $registro[$i];
  7.         for($x=0;$x<=4;$x++)
  8.         {
  9.                 if($i ne $x)
  10.                 {
  11.                         if($registro[$x] eq $registro[$i])
  12.                         {
  13.                                 $iguales=$iguales+1;
  14.                         }else{}
  15.                 }else{}
  16.         }
  17. }
  18. print "Cantidad de Nombres iguales son". $iguales;
  19. close(DATOS);
  20.  
  21.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
visualfree
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-11-19 03:01 @167

Re: Contar duplicados y mostrar número

Notapor gonzalos » 2009-11-30 18:03 @794

Hola, Explorer

Era una broma, pero creo que sí me llevará tiempo. Ya que hay infinita información sobre Perl y como dice la frase "Hay más de una manera de hacerlo". Y debes tener muy claro qué es lo que quieres hacer y qué es lo que hace Perl en cada momento.

Gracias por la información me miraré el hilo e iré haciendo los ejercicios propuestos.

Hola Visualfree, gracias por la ayuda; ahora sólo me quedaría mostrar en la salida de pantalla cada nombre junto al número de veces que se repite.

Bueno a ver si mañana tengo más tiempo e intento yo hacer mi código, esperemos que no me salga un bizcocho en vez de un programa de Perl :) .

Un saludo a los dos
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Contar duplicados y mostrar número

Notapor explorer » 2009-11-30 18:21 @806

La solución de visualfree no da el número de veces que se repite cada nombre, pero le falta poco.

La verdad, es que este problema se debería resolver con hash.
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: Contar duplicados y mostrar número

Notapor creating021 » 2009-11-30 19:59 @874

Eso es un poquito similar a este problema.

Bueno, la parte de los nombres es incorrecta... como dice explorer en su primer post, hay que hacer un bucle.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open SALIDA, ">fichero_salida.txt" or
    die "No se puede abrir fichero_salida.txt: $!\n";
print "Escriba exit para salir\n";
for (;;) {
    for my $num ( 1 .. 5) {
        print "$num Introduzca nombre y apellidos: ";
        chomp(my $id = <STDIN>);
        if ( $id eq "exit" ){ exit; }
        print SALIDA "$id\n";
    }
}
close SALIDA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero, no veo utilidad en hacer el bucle ya que el usuario pude hacer Crl-Z o exit, así que sobra un for :wink:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Contar duplicados y mostrar número

Notapor explorer » 2009-12-01 05:43 @280

Creo que más bien se parece a este otro (contar IP duplicadas). :)
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: Contar duplicados y mostrar número

Notapor gonzalos » 2009-12-02 15:51 @702

Bueno, aquí estoy de nuevo. He intentado (eso, intentado, porque no sale nada, ¡viva la ignorancia!), rehacer el código. Para entenderlo mejor he decidido ir paso a paso.

Lo que quiero hacer primero es que me lea el archivo y me imprima por pantalla sólo una entrada de cada nombre.

Lo que he hecho ha sido esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(DATOS,"entrada.txt");
@registro=<DATOS>;
while ( $registro[$x]<2 )
{
        print $registro [$x];
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero me entra en un bucle infinito, imprimiendo el nombre que se ha repetido más de una vez.

Un saludo
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron