• Publicidad

Diario de aprendizaje de un perlero desde cero

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

Notapor Zeokat » 2007-06-16 11:21 @515

Zeokat escribió:
Parece que devuelve el número de elementos del array tal y como hacía $#nombre_del_array.
Que no, que no lo has entendido. Que no es lo mismo el NÚMERO de elementos que el valor del ÍNDICE del ÚLTIMO elemento.


Sorry, no volvere a fallar en eso, ahora está 100% claro. :wink:


Explorer me dice que mi solucion me da una palabra de mas, pero la probé y me da exactamente 24 palabras, justo las que tiene que tener. A ver donde esta el fallo.... o esque ando despistado 8)

Voy a modificar un poco el codigo para que me de alguna pista de lo que esta pasando. Tal que me queda el siguiente codigo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;

open (TEXTO,"texto.txt");

my @texto=<TEXTO>;

my $texto = join('',@texto);  #Junto los elementos del array @texto y los almaceno en un escalar $texto

my @palabras = split(/\w+/, $texto);  #divido el escalar $texto usando como separadores las palabras
                                      #y las almaceno en el array @palabras

print '>',join(':',@palabras),'<';

close (TEXTO);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Tras ejecutarlo, el resultado es el siguiente

Código: Seleccionar todo
>: : : : : :
: :  : : : :
  : : : :  : :
: :         : : : <



Parece todo correcto, 24 elemntos, contando las de principio de linea.

Uff... no se si me estoy liando, o equivocando, pero lo veo correcto.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor explorer » 2007-06-16 12:16 @553

Es que depende de cómo sea el texto. Para asegurarte, pinta también scalar @palabras y así estarás seguro del número de elementos.
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

Notapor Zeokat » 2007-06-16 13:40 @611

Voy a por el siguiente ejercicio. En principio es fácil:

4) Encontrar áreas de cuadrados y rectángulos.


Escribí dos códigos, uno calcula área de cuadrados y el otro calcula áreas de rectángulos.

Cuadrado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;

print "Introduce el valor del lado del cuadrado:\n";

my $lado = <STDIN>;

my $area_cuadrado = $lado * $lado;

print "El área del cuadrado es $area_cuadrado";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Rectangulo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;

print "Introduce el valor del lado a del rectángulo:\n";

my $lado_a = <STDIN>;

print "Introduce el valor del lado b del rectángulo:\n";

my $lado_b = <STDIN>;

my $area_rectangulo = $lado_a * $lado_b;

print "El area del rectángulo es $area_rectangulo";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



1)¿Se pueden imprimir las dobles comillas?. Quería que el mensaje que pide el lado del rectángulo fuera:

Introduce el valor del lado "b" del rectángulo (con las comillas, pero es un problema, porque confunde esas comillas con las que usan en el print)


2)La solución que doy esta en dos códigos diferentes, por lo tanto es solución a medias, ya que lo ideal es que fuera todo el código en un único programa.

Para ello hay que hacer algo al principio que pida por teclado al usuario que es lo que quiere calcular si área de cuadrado o de rectángulo y en función de la entrada por teclado inicializar el código que calcula áreas de cuadrados o el que calcula áreas de rectángulos.

La verdad es que hasta ahora no me surgió este problema y no sé por donde empezar para solventarlo, ¿algún consejo?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor creating021 » 2007-06-16 13:58 @624

1)¿Se pueden imprimir las dobles comillas?. Queria que el mensaje que pide el lado del rectangulo fuera:

Introduce el valor del lado "b" del rectangulo (con las comillas, pero es un problema, porque confunde esas comillas con las que usan en el print)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "Introduce el valor del lado \"b\" del rectangulo\n"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

algun consejo?

SI, es muy fácil:
Para los dos casos pides los dos lados... si un lado es igual al otro, entonses es un cuadrado... de lo contario es un rectángulo.
Pero, compliquemos las cosas: la entrada de los datos es asi: lado1, lado2
(en un mismo STDIN).
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

Notapor Zeokat » 2007-06-16 14:43 @655

Para los dos casos pides los dos lados... si un lado es igual al otro, entonces es un cuadrado... de lo contrario es un rectángulo.


Eso ya lo pensé, pero quiero hacerlo bien, usando el método que tu dices metiendo por teclado lado1, lado2.

El consejo era porque no sé cómo hacer eso.


Yo tenía pensada otra manera que era algo como... que apareciera un mensaje al principio diciendo: "Para calcular el área de un cuadrado pulsa 1, para calcular el área de un rectángulo pulsa 2".

Pero tu formas también me sirve creating :wink: y me parece que de la forma que tu dices sí sé resolverlo. :)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-06-16 17:34 @774

Ejemplo sacado de la página 99 del libro "Learning Perl":
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "how old are you? ";
$a = <STDIN>;
chomp($a);
if ($a < 18) {
    print "So, you're not old enough to vote, eh?\n";
}
else {
    print "Old enough! Cool! So go vote!\n";
    $voter++; # count the voters for later
}
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

Notapor Zeokat » 2007-06-16 21:08 @922

Ese ejemplo es perfecto explorer.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;

print "Para calcular el área de un cuadrado pulsa 1 \n";
print "Para calcular el área de un rectángulo pulsa 2 \n";

my $eleccion = <STDIN>;
chomp($eleccion);

if ($eleccion == 1) {

    # Cálculo del área del cuadrado
    print "Introduce el valor del lado del cuadrado: ";

    my $lado = <STDIN>;
    chomp($lado);

    my $area_cuadrado = $lado * $lado;

    print "El área del cuadrado es $area_cuadrado";
}
else {

    # Cálculo del área del rectángulo
    print "Introduce el valor del lado \"a\" del rectángulo: ";

    my $lado_a = <STDIN>;
    chomp($lado_a);

    print "Introduce el valor del lado \"b\" del rectángulo: ";

    my $lado_b = <STDIN>;  
    chomp($lado_b);

    my $area_rectangulo = $lado_a * $lado_b;

    print "El area del rectangulo es $area_rectangulo";

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sólo me preocupa dos cosas y es que cuando introduzco datos por teclado vía <STDIN> después de introducirlos tengo que pulsar intro, por lo tanto el programa no hace exactamente lo que dice "Para calcular el área de un cuadrado pulsa 1", ya que hay que pulsar el uno o el 2 y luego enter... se podría solucionar ese problema para que fuese al pulsar 1 o 2 directamente.

Lo segundo es la condición, que no es efectiva 100%, es decir, funciona pero no del todo. Esta claro que sólo cuando entra un 1 por teclado calcula el área del cuadrado y cuando entra algo que no es uno (por ejemplo un 2) calcula el área del rectángulo..... jejeje... para que fuera todo correcto habría que pulir ese detalle, es decir: si se introdujese un valor que no fuese ni 1 ni 2 entonces enviase un mensaje tal como "Introducir un 1 o un 2" y que funcionase solo cuando se introdujera un uno o un dos, así quedaría perfecto el programa. :wink:
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-06-17 06:11 @299

Te he editado el código y arreglado algunas faltas en el texto.

En cuanto a recibir la entrada deseada, la solución es meter el mensaje del menú y la lectura del teclado en un bucle hasta que salga la entrada que buscas.

Y para leerlo en forma de pulsación, hay varios módulos al respecto, quizás el más cómodo sea Term::Inkey.
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

Notapor Zeokat » 2007-06-17 07:12 @341

Bien, con el módulo Term::InKey solucioné el problema de la pulsación, muy útil este módulo por cierto, que deja hasta limpiar la pantalla :)

El otro tema, lo de recibir la entrada deseada, me hablas de crear un bucle... mmm... suena bien jejeje, pero primero voy a ver si consigo saber qué es un bucle... intuitivamente parece algo que se repite muchas veces.

Por cierto ¿un bucle es lo mismo que un Loop?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-06-17 08:18 @387

En caso de dudas de conceptos informáticos, lo mejor es que consultes la enciclopedia.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron