• Publicidad

Tutorial Retro

Aprende Perl

Re: Tutorial Retro

Notapor explorer » 2020-07-23 06:07 @297

El problema está en los índices dentro @grafica.

Estás usando la variable $. que para Perl tiene un significa especial, como la $_. $. es el número de "línea" o de "entrada" leída desde la entrada estándar. En tu caso, si has introducido 20 números, pues $. valdrá 20.

Es mejor que uses otra variable cualquiera para recorrer los índices de @grafica.

Por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i (0 .. $#grafica) {                   # recorrer los índices de 0 al índice más alto de @grafica
  2.     # aquí saco la frecuencia y la multiplico por 10 para que me de un numero de entre el 0 y el 10.
  3.     $grafica[$i] = int(10 * $grafica[$i] / $total);
  4.  
  5.     if ($grafica[$i] <= 2) { $grafica[$i] = '*' }
  6.     ...
Coloreado en 0.002 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

Publicidad

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-07-23 08:21 @389

Sí, creía que $. me tomaría los valores de la línea de cada pasada del bucle foreach.

Aquí dejo la corrección (MUCHAS GRACIAS):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. print "introduce números de 0 a 100, cuando no introduzcas nada saldrá la gráfica\n";
  4.  
  5. until (0) {
  6.  
  7.     chomp( $entrada = <STDIN> );
  8.     last if !$entrada;
  9.     if ( $entrada <= 20  && $entrada > 0 )  { $grafica[0]++; }
  10.     if ( $entrada <= 40  && $entrada > 20 ) { $grafica[1]++; }
  11.     if ( $entrada <= 60  && $entrada > 40 ) { $grafica[2]++; }
  12.     if ( $entrada <= 80  && $entrada > 60 ) { $grafica[3]++; }
  13.     if ( $entrada <= 100 && $entrada > 80 ) { $grafica[4]++; }
  14.     $total++;
  15. }
  16.  
  17. for ( $i = 0; $i <= ($#grafica); $i++ ) {
  18.     $grafica[$i] = ( $grafica[$i] / $total ) * 10;
  19.  
  20.     if ( $grafica[$i] <= 2 ) { $grafica[$i] = '*'; }
  21.     if ( $grafica[$i] > 2 && $grafica[$i] <= 4 )  { $grafica[$i] = '**'; }
  22.     if ( $grafica[$i] > 4 && $grafica[$i] <= 6 )  { $grafica[$i] = '***'; }
  23.     if ( $grafica[$i] > 6 && $grafica[$i] <= 8 )  { $grafica[$i] = '****'; }
  24.     if ( $grafica[$i] > 8 && $grafica[$i] <= 10 ) { $grafica[$i] = '*****'; }
  25.  
  26. }
  27.  
  28. print "frecuencia de número introducidos del 0 al 20 $grafica[0] \n";
  29. print "frecuencia de número introducidos del 20 al 40 $grafica[1] \n";
  30. print "frecuencia de número introducidos del 40 al 60 $grafica[2] \n";
  31. print "frecuencia de número introducidos del 60 al 80 $grafica[3] \n";
  32. print "frecuencia de número introducidos del 80 al 100 $grafica[4] \n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por Miguel-ag82 el 2020-07-24 00:56 @080, editado 1 vez en total
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor explorer » 2020-07-23 10:18 @471

Hay otro error: cuando el usuario no introduce ningún valor (porque quiere terminar la entrada) o introduce una cadena de caracteres alfabética, $entrada toma el valor 0, así que la gráfica resultante no es correcta (hay un valor $grafica[0] demás).

Por otra parte, seguro que se te ocurre alguna manera para evitar tener que repetir casi las mismas líneas 5 veces. Es cuestión de aplicar algo de matemáticas...
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: Tutorial Retro

Notapor Miguel-ag82 » 2020-07-24 00:54 @079

Sí, cambio el bucle y le meto un last if.

Sobre hacerlo en menos líneas... Esta es la solución que me pareció más sencilla y mejor me funcionó. ¿Qué se me ha pasado por alto?

¡Gracias!
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-07-24 01:44 @114

EJERCICIO 3.1

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. open( ENTRADA, "apellidosnombre.txt" );
  4.  
  5. print "listado de nombres: \n\n\n";
  6.  
  7. while (<ENTRADA>) {
  8.     @linea = split;
  9.     $contador{ $linea[ $#linea - 1 ] }++;
  10.     $contador{ $linea[ $#linea - 2 ] }++;
  11.  
  12.     print "@linea \n";
  13.  
  14. }
  15.  
  16. print "\nrepetición de apellidos \n";
  17. @claves = keys(%contador);
  18. foreach (@claves) {
  19.  
  20.     print "el apellido $_ se repite $contador{$_} \n";
  21.  
  22. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-07-24 01:49 @117

EJERCICIO 3.2 (siendo manta.pl, un programa que pide entrada por parte del usuario no sé cómo reducirlo a la mitad de líneas).
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-07-24 06:15 @302

EJERCICIO 3.3

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. die "falta nombre de fichero que contar" unless $ARGV[0];
  4.  
  5. $argumento1 = <$ARGV[0]>;
  6. open( FICHERO1, "$argumento1" );
  7.  
  8. while (<FICHERO1>) {
  9.  
  10.     @palabras = split;
  11.     $contadorpalabras = $contadorpalabras + ( $#palabras + 1 );
  12.  
  13.     @letras = split( '', $_ );
  14.     $contadorletras = $contadorletras + ( $#letras + 1 );
  15.     $contadorlineas++;
  16. }
  17.  
  18. print "$contadorlineas lineas $contadorpalabras palabras $contadorletras Bytes $ARGV[0] \n";
  19.  
  20. if ( $ARGV[1] ) {
  21.     $argumento2 = <$ARGV[1]>;
  22.     open( FICHERO2, "$argumento2" );
  23.     while (<FICHERO2>) {
  24.  
  25.         @palabras2         = split;
  26.         $contadorpalabras2 = $contadorpalabras2 + ( $#palabras2 + 1 );
  27.         @letras2           = split( '', $_ );
  28.         $contadorletras2   = $contadorletras2 + ( $#letras2 + 1 );
  29.         $contadorlineas2++;
  30.  
  31.     }
  32.  
  33.     print "$contadorlineas2 lineas $contadorpalabras2 palabras $contadorletras2 Bytes $ARGV[1] \n";
  34. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-08-03 06:24 @308

#EJERCICO 3.4 He tenido que usar expresiones regulares, que se dan un poco más adelante del tutorial y lo he hecho sobre un apache.log por si quieres probarlo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. open( LOG, "ficheros/apache.log" );
  4.  
  5. print "1- mostrar dominos de primer nivel \n";
  6. print "2- mostrar dominios de segundo nivel \n";
  7.  
  8. chomp( $opcion = <STDIN> );
  9.  
  10. while (<LOG>) {
  11.  
  12.     $primernivel[$.] = $_;
  13.     if ( $primernivel[$.] =~ /(https?\W+[A-Za-z0-9]+.[A-Za-z0-9]+.[com|es|org]+)/ && $opcion == 1 ) {
  14.         $dominiosprimernivel{$1}++;
  15.  
  16.         #print "$1 \n";
  17.     }
  18.     elsif ( $primernivel[$.] =~ /(https?\W+[A-Za-z0-9]+.[A-Za-z0-9]+.[com|es|org]+\.[mx|org|net|eu]+)/ && $opcion == 2 )
  19.  
  20.     {
  21.         $dominiossegundonivel{$1}++;
  22.     }
  23. }
  24.  
  25. close LOG;
  26.  
  27. @claves  = keys(%dominiosprimernivel);
  28. @claves2 = keys(%dominiossegundonivel);
  29.  
  30. $i = 0;
  31.  
  32. if ( $opcion == 1 ) {
  33.     foreach (@claves) {
  34.         print "$i $claves[$i] visitas $dominiosprimernivel{$_} \n";
  35.         $i++;
  36.     }
  37. }
  38.  
  39. if ( $opcion == 2 ) {
  40.     foreach (@claves2) {
  41.         print "$i $claves2[$i] visitas: $dominiossegundonivel{$_}\n";
  42.         $i++;
  43.     }
  44. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-08-07 02:32 @147

EJERCICIO 3.5

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use MIME::Base64;
  4. use Data::Dumper;
  5.  
  6. my @passwd;
  7. open( DNI, "../ficheros/dni.txt" );
  8.  
  9. while (<DNI>) {
  10.  
  11.     my $gid      = int( rand(100) );           # genero un gid aleatorio.
  12.     my @listadni = split;                      # separo $_ en palabras.
  13.     my $password = encode_base64( $listadni[3] );    # utilizo el modulo MIME::Base64 para encriptar directamente
  14.     my @letras   = split( '', $listadni[0] );  # separo el nombre en letras para luego solo usar la inicial
  15.     my $user     = $letras[0] . $listadni[1];  # genero el usuario con la primera letra del nombre y el apellido.
  16.  
  17.     chomp($password);                          # me pillaba un salto de línea
  18.  
  19.     push @passwd,
  20.         { usuario => $user, pass => $password, gid => $gid, nombre => $listadni[0], apellidos => $listadni[1]
  21.         };                                     # meto el hash en un array para luego ordenarlo y añadir el uuid por orden alfabetico.
  22.  
  23. }
  24.  
  25. my @passwd_ordenado = sort { $a->{usuario} cmp $b->{usuario} } @passwd;    #ordeno alfabéticamente por usuario
  26.  
  27. $uuid = 1000;                                  # creo valor de uuid, lo añado y pinto todo
  28. foreach (@passwd_ordenado) {
  29.  
  30.     $passwd_ordenado{ uuid => $uuid };
  31.     print $passwd_ordenado[$i]{'usuario'} . ":"
  32.         . $passwd_ordenado[$i]{'pass'} . ":"
  33.         . $uuid . ":"
  34.         . $passwd_ordenado[$i]{'gid'} . ":"
  35.         . $passwd_ordenado[$i]{'nombre'} . ":"
  36.         . $passwd_ordenado[$i]{'apellidos'} . "\n";
  37.     $i++;
  38.     $uuid++;
  39. }
  40.  
  41. close DNI;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

Re: Tutorial Retro

Notapor Miguel-ag82 » 2020-08-07 05:01 @250

EJERCICIOS 4

Realizar un programa que lea un fichero organizado en filas y columnas, tal como este

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
uno dos tres
cuatro cinco seis
siete ocho nueve
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y genere un documento HTML con los contenidos del fichero organizados en una tabla; cada elemento del fichero deberá ir en una celda diferente, así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html><table>
  2. <td><tr>uno</tr><tr>dos</tr><tr>tres</tr></td>
  3. <td><tr>cuatro</tr><tr>cinco</tr><tr>seis</tr></td>
  4. <td><tr>siete</tr><tr>ocho</tr><tr>nueve</tr>></td>
  5.  
  6. </table>
  7. </html>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aunque no es estrictamente necesario, usad una matriz bidimensional para hacerlo.
Miguel-ag82
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2020-07-17 02:53 @162

AnteriorSiguiente

Volver a Formación

¿Quién está conectado?

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