• 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 explorer » 2007-06-15 08:48 @408

* Las comillas dobles hacen interpolación de variables, pero no de expresiones. $#texto es una variable 'especial' que guarda el índice del último elemento del array @texto. Si @texto tiene nueve elementos, valdrá 8. Así que no es correcto lo que dices al final de la primera solución.

* La variable @lineas es distinta de la variable $lineas, ya que una es un array y la otra un escalar.

* Una cosa es el número de elementos de un array o de una lista. Y otra cosa es cuál es el índice del último elemento del array. Generalmente el índice del último elemento será uno menos que el número de elementos, pero eso se puede cambiar (pero no aconsejable).

* Analizando la segunda solución:

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

use strict;

open (TEXTO,"test.txt");

my @texto=<TEXTO>;            # @texto tiene todas las líneas de TEXTO, así que tiene 10 elementos

my @lineas = $#texto;         # Se declara @lineas, y el primer elemento, $lineas[0] lo inicializamos a 9
                              # (porque $#texto es el índice del último elemento)

my $final = @lineas+9;        # Se declara $final y se inicializa al valor de @lineas en escalar, que es
                              # igual al número de sus elementos, 1, y se le suma 9.

print "El numero de lineas es $final";  # $final vale 10

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


* Un array evaluado en contexto escalar devuelve el número de sus elementos (longitud del array).

* Otras posibilidades de solución son:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $final = @texto;
print "El numero de lineas del archivo es ", $final;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "El numero de lineas del archivo es ", scalar @texto;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* Cosas de Perl: lo dicho antes sobre que en las comillas dobles no se pueden interpolar expresiones no es del todo cierto. Lo normal es interpolar valores de variables. Si una de esas variables es un array, saldrán todos los elementos del array. Perl hace aquí una doble interpolación: convierte de variable array a sus elementos y luego los va colocando dentro del string, con un separador. Bueno, pues podemos hacer un truco: convertimos nuestra expresión en un array de un sólo elemento:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "El numero de lineas del archivo es @{[ $#texto + 1 ]}";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero claro... esto es bastante rebuscado mirando las otras soluciones. Pero está bien acordarse de esto cuando necesitemos meter una expresión dentro de un string, y no tener que hacer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "El numero de lineas del archivo es ", $#texto + 1;
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

Publicidad

Notapor Zeokat » 2007-06-15 09:17 @429

Bien, me quedaron unas dudas que no tenia muy claras ya despejadas.

Lo que no llego a entender es por que esta mal la primera solucion...

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.001 segundos, usando GeSHi 1.0.8.4


ya que me dices:

"$#texto es una variable 'especial' que guarda el índice del último elemento del array @texto. Si @texto tiene nueve elementos, valdrá 8. Así que no es correcto lo que dices al final de la primera solución."

Vamos aya, mi txt tiene 10 lineas, de ahi que cuando pongo
"my @texto=<TEXTO>;" en el array @texto se almacenan las 10 lineas, pero como perl cuenta desde cero, al decirme el numero del ultimo indice me dira que es el 9.

Por eso debo sumarle uno, para ello pongo
"print $#texto + 1;" con esto corrijo que perl empiece contando desde 0 y me da el numero de lineas, no se por que est mal, porque funcionar funciona, me devuleve el numero correcto de lineas en todas las pruebas que hice.


Y sin mas, me pongo con el siguiente ejercicio.

4) Encontrar áreas de cuadrados y rectángulos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor creating021 » 2007-06-15 09:25 @434

¡Hombre, que vas rápido! :D

Bueno, un par de cosas:

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.

Lo de length, lo descubriste rápido, que bien, pero en cuanto a chop...
Lo que chop hace es cortar el último carácter, si no hay retorno de carro ("\n") cortará el último carácter dado (podría ser parte del texto).

Tenemos la función chomp. que no quita el último dato (si es que está).
Ese dato es asignado por $/ que es asignada por Perl y suele ser "\r\n" o simplemente "\n";

Bueno, con ejercicio del archivo, hay otra forma de hacerlo (me sorprende que explorer no la haya dicho, siendo que el ya la ha enseñado antes).

Era usando while, en este foro (y en últimos mensajes, hecho por otros) hay algo sobre eso, por si te interesa...

Bueno, pero aún no has hecho lo que decía el ejercicio, a ver si te pone a pensar un poquito (no creo, teniendo en cuenta lo que has hecho).
Cuenta el número de palabras es un string pero teniendo en cuenta que estamos en archivos... cuenta el número de palabras en un archivo. :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

Notapor creating021 » 2007-06-15 09:30 @437

Es que es mejor la otra posible solución que te da explorer, la que usa scalar puesto que esta función da una respuesta más rápida que $#array +1 o algo similar.
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-15 09:46 @448

Ok, aclarado entonces lo que decía explorer.

Vamos a ver.... el ejercicio que me propones ahora creating es contar las palabras de un archivo.

Mmmm.... las palabras están separadas por espacios, si cuento el número de espacios y le sumo uno, me da el número de palabras, jejeje es una forma un poco cavernícola de hacerlo, pero puede funcionar.

El problema es que a veces los textos tiene sangrías diferentes, por ejemplo:

Código: Seleccionar todo
Y entonces dijo:
    "saludos"


Ahí se ve que si cuento el número de espacios ya no funciona el método, por lo que quizás en primer lugar debería de tratar de usar un expresión regular que sustituya x espacios seguidos por un único espacio y luego contar los espacios y sumarle uno.

No sé..... es la única manera que se me ocurre ahora mismo.... aunque supongo que habrá otra más precisa, ya que el método que planteo es un poco simplón y si la primera línea empieza por un espacio o la última termina en un espacio ya no sirve.... quizás agregando esas dos condiciones y compensando esos espacios extra se consiga el número de palabras.

Jejejeje estoy seguro que lo estoy planteando de una forma muy complicada y que seguro que se resuelve de alguna manera más sencilla.... jejeje... sigo pensando a ver qué se me ocurre.

¡Se aceptan pistas! ;)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor creating021 » 2007-06-15 10:21 @473

Pista:
@palabras = split(/\w+/, $linea);

Con eso te ayudo mucho, je, je.
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-15 11:56 @539

Lo que me imaginaba esa función split... leeré acerca de ella a ver qué se me ocurre. :)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2007-06-15 14:23 @641

Lo que estaba mal es la frase: "... por eso hay que sumar uno al número de elementos del array."

Debería ser: "... por eso hay que sumar uno al índice del último elemento 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 explorer » 2007-06-15 14:41 @653

Zeokat escribiste:Ahí se ve que si cuento el número de espacios ya no funciona el método, por lo que quizás en primer lugar debería de tratar de usar un expresión regular que sustituya x espacios seguidos por un único espacio y luego contar los espacios y sumarle uno.

No sé..... es la única manera que se me ocurre ahora mismo.... aunque supongo que habrá otra más precisa, ya que el método que planteo es un poco simplón y si la primera línea empieza por un espacio o la última termina en un espacio ya no sirve.... quizás agregando esas dos condiciones y compensando esos espacios extra se consiga el número de palabras.

El método de contar espacios es perfectamente válido si supiéramos a priori que esa regla se cumplía.

Pistas:
* Podemos buscar conjuntos de espacios en blanco
* Una palabra se compone de caracteres que forman una palabra y que está rodeada de caracteres que no forman una palabra (parece algo obvio, pero así es como funcionan a veces las expresiones regulares).
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 15:35 @691

Buff... no doy con el camino correcto. Voy a hacer una cosa, voy a tratar de hacer un ejercicio más sencillo primero, que consiste simplemente en contar el número de espacios de una frase.

La frase es:

"El avión vuela rápido y alto"

El resultado tendrá que ser 5 espacios. A ver si lo consigo.

Tras la pista de explorer pensé en tratar de hacer algo parecido a buscar el patrón [espacio az AZ 09 espacio] y cada resultado sería una palabra, pero sigue teniendo el inconveniente de la primera palabra de línea ya que no hay espacio mmm... quizás buscando y contando 3 patrones si funcione... los patrones serían.

[inicio_de_linea az AZ 09 espacio]
[espacio az AZ 09 espacio]
[az AZ 09 fin_de_linea]

Jejeje aun no se si se pueden buscar inicios de línea y fines de línea pero me parece que sip... :)

Aunque lo primero es lo primero y es contar los espacios de la primera frase. :)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron