• 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.

Diario de aprendizaje de un perlero desde cero

Notapor Zeokat » 2007-06-14 16:40 @736

Bueno vamos a la aventura.... me he propuesto aprender Perl, aunque sea poco a poco.... pero lo intentaré.

Lo primero que he hecho fue leer el tutorial de esta web de Perl básico parte I ..... tras leerlo lo entendí bien pero me faltaba algo, la práctica.... demasiadas cosas nuevas como para seguir leyendo sin antes haber practicado un poco.

Para solucionar esto creating021 me propuso una serie de ejercicios.

Los podéis ver aquí:
viewtopic.php?t=1754

Sin más me pongo a tratar de escribir el primer ejercicio:

"1) Haz un programa que te pregunte tu edad y calcule cuántos años faltan para que cumplas 3000."

Abrimos el Notepad y empezamos...

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


print "Cual es tu edad?";

my $edad = <STDIN>;

my $resta;
$resta = 3000 - $edad;

print "Para que cumplas 3000 faltan $resta"
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Problemas y dudas:

1) La primera línea del código la cogí de los ejemplos que te instala ActivePerl... vi que todos los ejemplos la tenían y por eso se la puse...

:?: ¿Es necesaria? ¿Qué significa? ¿Para qué sirve?


2) No soy capaz de que aparezcan los caracteres "¿" y "ñ" al hacer un print...

:?: ¿Hay alguna manera?

3) Un mismo problema tiene varias soluciones, esa es la que se me ocurrió... parece que funciona bien...

:?: Alguna observación? alguna forma de hacerlo mejor (ojo, teniendo en cuenta lo poco que se hasta ahora)?

4) ¿Alguna recomendación a la hora de escribir el código, me refiero a que en este caso son 4 o 5 líneas de código y es difícil perderte...

:?: ¿Cuál sería el mejor orden para escribir el código...? ¿Declaro todas las variables que vaya a usar al principio? ¿Tabulo de otra manera? No sé... ¿Alguna recomendación sencilla para empezar?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor Zeokat » 2007-06-14 17:05 @753

SEGUNDO EJERCICO:

Calcular el número de letras en una palabra tomada del prompt.

Jejeje.... este ejercicio ya me quede estancado... a ver.... me explico.

Primero puse lo siguiente:

Código: Seleccionar todo
#!/usr/bin/perl -w

print "Escribe una palabra para contar sus caracteres";

my $palabra = <STDIN>;

my $contador;
$contador = ¿?¿?¿?¿?¿?¿?¿?¿?¿?¿;

print "Tu palabra tiene $contador caracteres"



No se como programar ese contador... tengo la palabra que entra por teclado almacenada en la variable $palabra pero como contar sus caracteres??


P.D: lei algo por ahi de chop y length pero ni idea de como usarlo.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-06-14 17:35 @774

1) Es la línea de shebang. En la página Perl de Wikipedia se comenta un poco sobre esto.

Le dice al sistema operativo con cuál y dónde se encuentra el programa necesario para interpretar y ejecutar el código que sigue. En Windows no es necesario (sección non-Unix systems) porque ese sistema se basa en la extensión del fichero para saber dónde está el ejecutable perl.exe. Yo suelo poner #!Perl.

Es también útil porque puedes colocar allí opciones de ejecución (como el -w).

2) Posiblemente porque el Notepad está trabajando en UTF8 y la consola de comandos en Win1252.

3) Falta un ';' al final. No es grave, pero has de tomártelo como costumbre ponerlo siempre.
Pon 'use strict;' al principio del programa. Te obligará a programar de forma estricta. Deberás entonces declarar todas las variables (con my() y our()) y a cambio Perl te avisará cuando te equivoques al escribir alguna variable.
El '-w' lo puedes cambiar por un 'use warnings;'.
Si quieres más ayuda (en inglés) desde el Perl, pon 'use diagnostics;'.
Algunas cosas se pueden abreviar, como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $resta = 3_000 - $edad;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero eso se 'cura' leyendo código. Adelante. Pero si funciona un programa, es lo importante.

4) Para declarar variables yo sigo este orden y nomenclatura:
Código: Seleccionar todo
Regla de la declaración:
* Constantes en todo el programa. Al principio de todo.
* Variables globales en todo el programa. Al principio de todo.
* Variables de contexto muy limitado: en el mismo lugar donde se necesitan.

Regla de escritura:
* Constantes, en mayúscula: $DIR_PRINCIPAL = 'C:/temp';
* Variables, en minúscula, separando las palabras con '_': $almacen_de_bichos

Regla de la longitud del nombre:
Cuanto más importante es una variable, más larga es
(el recíproco también es cierto):

foreach my $persona ( @personas_con_discapacidad_con_derecho_a_pension ) {
    my $grupo = $grupos_organizativos{ $persona };
    for $i ( 1 .. 12 ) {
        $cotizacion_anual{$grupo}{$persona} = 234,5 * $i;
    }
}

Dos recomendaciones: lee mucho código y si te es posible, leete el libro "Perl Best Practices", de Damian Comway. No importa si no entiendes algunos conceptos a partir de la mitad del libro, pero aprenderás a tabular, colocar, indentar y nombrar a variables y funciones.

Y en vez del Notepad, puedes bajarte el Komodo EDIT de ActiveState.

En este foro básico hay muchos más consejos sobre cómo empezar.
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 explorer » 2007-06-14 17:56 @789

Perl es un lenguaje informático y como tal se compone de una serie de funciones y operadores. Lo que distingue a Perl de otros lenguajes es que es muy 'rico' en ese sentido.

No te queda otra opción que, al menos, leerte la lista de esas funcionesy operadores.

Si el problema es el inglés, lo mejor es que empieces por lo que hay en castellano: tutoriales y manuales. No tienes que leerles enteros, sino localizar problemas parecidos a lo que intentas resolver y ver cómo lo hacen.

O este mismo foro.
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 creating021 » 2007-06-14 19:08 @838

Algo más (sí hay más, aprate de lo que explorer te ha dicho :lol: )
Mira, hay una diferencia muy grande entre carácter[1] y palabra.
Si contamos carácteres sería todo lo que hay en el STDIN, es decie, se contarían consas como los espacios.
______
1. http://es.wikipedia.org/wiki/Carácter_(informática)
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-14 19:27 @852

Bien gracias por las respuestas veo que tengo que leer unas cosillas básicas para poder ponerme manos a la obra con el segundo código.

Me bajo el Komodo EDIT que parece que me será de ayuda ya que chequea bastantes cosillas automáticamente y te ayuda detectar errores. :)

Gracias por la ayuda.... sigo leyendo, en unos días pongo mis progresos. ;)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor Zeokat » 2007-06-14 20:34 @898

Bueno creo tener la solución al ejercicio número dos. Ahí va.

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

use strict;

print "Palabra?\n";

my $palabra = <STDIN>;

chop($palabra);

my $longitud = length($palabra);

print "El numero de caracteres de la palabra es $longitud";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo aprendido en este ejercicio fue que si pongo \n me hace un salto de línea y queda mejor a la hora de pedir una entrada por teclado :)

La función chop , que l oque hace es eliminar los salto de linea, es decir eliminaria los \n

La función length, que cuenta los caracteres de una variable.

quizás no me expliqué con total exactitud pero por el momento es lo que hay... aún queda mucho por leer.

Me paso al siguiente ejercicio.
3) Calcular el número de líneas de un archivo dado.

Para este ejercicio tomaré como archivo dado un txt llamado archivo.txt y con el siguiente contenido:

Código: Seleccionar todo
Perro
Gato  Morcilla
Morcilla @yup@yup@yup@yup@yup
Sol  1233334  1233334  1233334  sdfsdfsdf@3s/;][W0P-~
1233334
@yup
/////\\\\\
45t3r15c0/////\\\\\**********/////\\\\\
<>::<>
/;][W0P-~kk¿
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor Zeokat » 2007-06-15 06:07 @296

A ver, tengo un problemilla con el tercer ejercicio.

Por el momento tengo escrito el siguiente código.

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

use strict;

open (TEXTO,"test.txt");

my @texto=<TEXTO>;

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


Lo aprendido hasta el momento fue como abrir un archivo y asignarle un nombre lógico. También me di cuenta de que al tratarse de varias líneas el fichero tiene varios elementos, por lo que hay que usar un array @texto.

Ahora el problema. Como tengo que contar el número de líneas que tiene el documento, la forma de contar esas líneas, sería contar el número de saltos de línea que hay, es decir el número de "\n".

Pero no encontré ninguna función que buscará elementos dentro de un array, lo que si encontré fue una expresión regular =~ que me dice si existe algo que yo especifiqué dentro del array... Mmm... no sé, ahora si que me perdí un poco; ¿alguna pista?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-06-15 06:53 @328

Pistas:
Al leer el documento en forma de lista, cada línea del fichero está en cada elemento del array, por lo que el número de líneas del fichero es igual al número de elementos del array.
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-15 07:59 @374

Bueno, este ejercicio está interesante... traigo dos soluciones: una la entiendo y la segunda la entiendo a medias, porque la hice por tanteo. Además me surgieron nuevas dudas.

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

use strict;

open (TEXTO,"test.txt");

my @texto=<TEXTO>;

print "El numero de lineas del archivo es ";

print $#texto + 1;

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


Este código lo entiendo, lo que se me escapa es que puedo meter entre las comillas $#texto y me lo imprime, pero si pongo $#texto + 1, no realiza la operación suma, deduzco porque esas comillas se introducen para que imprima literalmente, sin realizar operaciones con variables, arrays, etc... Además esta algo a tener en cuenta y es que Perl empieza contar desde 0 y no desde uno.... por eso hay que sumar uno al número de elementos del array.

Este otro código, funciona pero.... vamos a verlo:

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

use strict;

open (TEXTO,"test.txt");

my @texto=<TEXTO>;

my @lineas = $#texto;

my $final = @lineas+9;

print "El numero de lineas es $final";

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


Se ve que uso un array nuevo "@lineas" y lo igualo con "$#texto" que me dice el número de elementos del array.

¡Anda!, ahora que lo escribo, veo que para este código he hecho trampa ya que partí de que sabia el número final de líneas (en este caso al tratarse de un txt pequeño lo sé.... pero el objetivo sería partir de que el archivo tiene muchas líneas y que no cuantas tiene a simple vista).

Lo que no pude hacer fue usar un variable escalar, es decir $lineas en lugar de @lineas, eso me daba error, pero no entiendo porque no me deja almacenar en el escalar.... ¿ alguna idea ?

Otra cosa, como sería lógico (para mi)... en la línea "my $final = @lineas+9;" pondría la operación "my $final = @lineas+1;" ya que sumaría los elementos del array que son 9 (empezando a contar desde 0) y le sumo uno, lo que daría 10.... pero no.... para que dé 10 fui tanteando y hay que sumarle 9 ...jeje... ¿por qué?

Vaya, vaya, vaya..... mientras escribía la pregunta se me ocurrió una posible razón de porque hace eso... es simplemente porque digamos que el @lineas es una matriz con 9 elementos y cuando igualo esa matriz a un escalar pasa de tener 9 elementos a tener 1 porque es un escalar.

Pero aun así ¿por qué me muestra en pantalla el siguiente código que el número de líneas es 1 si Perl empieza a contar desde cero y un escalar tiene un elemento lo que para Perl sería un número de elementos igual a 0?

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

use strict;

open (TEXTO,"test.txt");

my @texto=<TEXTO>;

my @lineas = $#texto;

my $final= @lineas;

print "El numero de lineas es $final";

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


Buffff..... no se si me habré explicado bien, sera difícil entenderme.... perdón :oops:

P.D: cada vez me gusta más esto de aprender Perl, Gracias explorer y creating por ir respondiendo a mis dudas.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron