• Publicidad

Buscar dato en archivo

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

Re: Buscar dato en archivo

Notapor otronovato » 2013-08-28 17:35 @774

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $fechas_en_archivo{ (split " ")[0] }++;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

¡Lógico...! (Pero sólo cuando te lo explican) :wink:

En leer-fichero-separar-campos-de-cada-registro-t865.html explicas cómo utilizar unpack() para separar campos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ($campo1,$campo2,$campo3,$campo4) = unpack("a10 a14 a18 a18", $linea);
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Este método parece mucho más poderoso, ya que funciona aunque no tengamos un carácter de separación. (Personalmente sólo lo había usado para leer archivos binarios en el formato que necesitaba). Pero... No invita a pensar en un algoritmo basado en un hash como el que has publicado.

El caso es que voy viendo que no sé cuándo debo utilizar un hash() y cuándo es preferible usar arrays. (De la misma manera que hay veces que veo claro el uso de map{}, y otras que no veo cómo aplicarlo, y me busco la vida a base de iteraciones...)

¿No tendréis un cuaderno de ejercicios? :wink:

Gracias, un saludo.
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Publicidad

Re: Buscar dato en archivo

Notapor explorer » 2013-08-28 18:45 @823

otronovato escribiste:El caso es que voy viendo que no sé cuándo debo utilizar un hash() y cuándo es preferible usar arrays.
Los array es cuando tienes una lista de elementos que, en su concepto, están unos al lado de otros, o forman una secuencia (al menos en su mayor parte). Por eso luego podemos referirnos a ellos usando los índices numéricos. O también cuando solo queremos almacenar o recuperar elementos sin más, como el caso de usar push/pop/shift/unshift.

El símil serían las distintas páginas de un libro: podemos acceder a cada página con tan solo usar el número de página. Y también podemos pasar las páginas hacia adelante y hacia atrás. Podemos desarmar el libro (shift) y volverlo a componer (push).

En cambio, un hash es cuando una clave se relaciona con un valor (esto es lo que es un hash en sí). En el caso del libro, sería el índice alfabético que está al final. Un hash sería capaz de responder a la pregunta "¿En qué páginas aparece la palabra 'Perl'?". Iríamos al final del libro, buscaríamos por 'Perl', y al lado aparece el listado de páginas donde aparece esa palabra. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @páginas_con_Perl = @{ $índice{'Perl'} };    # %indice es un hash de arrays
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

También nos sirve para recordar cosas. Primero, aprendemos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %fechas_en_el_archivo;
  2. ...;
  3. # leemos las fechas
  4. while (....) {
  5.    ...;
  6.     $fechas_en_el_archivo{ $fecha } = 1;   # realmente, no importa el valor, con tal de ser positivo
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y luego vemos si otra fecha estaba en el archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (exists $fechas_en_el_archivo{ $otrafecha } ) {
  2.     ...;
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Fíjate que aquí nos ahorramos el clásico bucle de comprobación por todas las fechas leídas antes. Perl se encarga de buscar $otrafecha dentro del hash y devolvernos el valor correspondiente, pero a nosotros nos da igual ese valor. Solo nos interesa saber si $otrafecha existe como clave o no, porque para nosotros significará que esa $otrafecha sí que la hemos visto antes en el archivo anterior.

También sirve para hacer traducciones, como lo estás haciendo en tus programas, en que conviertes de letra a número y al revés. En fin, se puede usar para muchas cosas.

Para entender mejor lo que es esto de los hash, primero mírate la definición de Función hash y luego vas a Tabla hash. Si entiendes cómo funciona por dentro, verás más fácil sus posibles usos.

En perldata tienes ejemplos de acceso a los dos.

otronovato escribiste:¿No tendréis un cuaderno de ejercicios?
Yo ahora estoy leyendo "Learning_Perl-6Ed-brian_d_foy-Tom_Phoenix-Randal_L_Schwartz-O_Reilly-9781449303587-2011", porque en noviembre tengo que dar un curso en Madrid :) A este libro se le puede acompañar un cuaderno de ejercicios para los alumnos, el "Student_Workbook_for_Learning_Perl-2Ed-brian_d_foy-O_Reilly-9781449328061-20120125".
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: Buscar dato en archivo

Notapor otronovato » 2013-08-29 12:22 @557

Perl me ha permitido hacer tantas cosas teniendo tan poca idea que no me había dado cuenta de la importancia de estudiar en profundidad las estructuras de datos que proporciona. Que son, además, la base de un estilo algorítmico muy peculiar que no tiene nada que ver con lo que estamos acostumbrados en C.

Así que, si sumamos que mis conocimientos de algoritmos son viejos y dispersos y que no sé utilizar las poderosas estructuras de datos que Perl implementa...

Aún tengo que aprender más para ser capaz de leer verdadero código Perl, (que va a ser la solución), porque de momento las peculiaridades sintácticas imponen su dificultad a la que plantea el propio algoritmo. (No veo por dónde voy conduciendo porque tengo que mirar la palanca y los pedales cada vez que quiero cambiar de marcha, podríamos decir).

No deja de ser una faena que Perl nos permita hacer programas que funcionan casi sin saber... :lol:

PS: Respecto al libro, tengo entendido que Perl 6 tiene poco que ver con Perl 5. ¿Es así?
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Buscar dato en archivo

Notapor explorer » 2013-08-29 19:34 @856

otronovato escribiste:Perl me ha permitido hacer tantas cosas teniendo tan poca idea que no me había dado cuenta de la importancia de estudiar en profundidad las estructuras de datos que proporciona. Que son, además, la base de un estilo algorítmico muy peculiar que no tiene nada que ver con lo que estamos acostumbrados en C.
Con la base de C, se entienden muchas cosas de Perl. Y alguna sintaxis, como la de '->'.

Sabiendo un 20 % de Perl, puedes aplicarlo a más de un 80 % de los problemas diarios. No existe la obligación de saberlo todo, todo. La gente de administración, por ejemplo, apenas usa Perl como si fuera un super-shell, y con eso les basta.

otronovato escribiste:Así que, si sumamos que mis conocimientos de algoritmos son viejos y dispersos y que no sé utilizar las poderosas estructuras de datos que Perl implementa...
Tampoco son tantas... Tres :)

otronovato escribiste:Aún tengo que aprender más para ser capaz de leer verdadero código Perl, (que va a ser la solución), porque de momento las peculiaridades sintácticas imponen su dificultad a la que plantea el propio algoritmo. (No veo por dónde voy conduciendo porque tengo que mirar la palanca y los pedales cada vez que quiero cambiar de marcha, podríamos decir).
En varios sitios de la documentación y en varios libros, se recuerda que Perl no obliga a seguir ningún paradigma de programación en concreto. Si el programa funciona, bien. Si se entiende el código, mejor. Si está documentado, perfecto. Si es útil para la comunidad, solidario. Si es divertido, ¡genial!

otronovato escribiste:No deja de ser una faena que Perl nos permita hacer programas que funcionan casi sin saber...
Bueno, siempre puedes volver a intentarlo con Java.

Se dice de Perl que intenta ser un lenguaje "natural", en el sentido de que nos permite expresarnos de una forma muy cercana a lo literal.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $ciudadano (@ciudadanos) {
  2.     $ciudadano->sueldo( incremento => '20%' )
  3.         if $ciudadano->es_ministro;
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

otronovato escribiste:PS: Respecto al libro, tengo entendido que Perl 6 tiene poco que ver con Perl 5. ¿Es así?
Solo tienen algunas cosas en común. Digamos que si ves código de Perl 6, lo identificas con Perl, pero luego, en los detalles, te das cuenta de que cambian cosas.
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: Buscar dato en archivo

Notapor otronovato » 2013-08-29 20:19 @888

Bueno, siempre puedes volver a intentarlo con Java.

¡Éso duele! :lol:
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Re: Buscar dato en archivo

Notapor explorer » 2013-08-30 14:23 @641

otronovato escribiste:Así que, si sumamos que mis conocimientos de algoritmos son viejos y dispersos y que no sé utilizar las poderosas estructuras de datos que Perl implementa...
Este comentario tuyo me ha animado para apuntarme a este curso, para reciclar mis conocimientos. Lo malo es que 1) está en inglés, y 2) hay que hacer los ejercicios en Java :evil: Menos mal que no son complicados, al menos los que veo en la primera semana de curso.
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: Buscar dato en archivo

Notapor otronovato » 2013-08-30 20:19 @888

Pues ahora que tengo tiempo no estaría mal que me pusiera a ello. El problema, además del inglés, es que mi único acercamiento a Java, in illo tempore, cuando era una novedad, me dejó convencido de que es, (valga el chiste), a C++ como Ubuntu a Debian.

Lo que sí que empecé a hacer es repasar un par de libros que tengo por casa, el de Joyanes, sobre algoritmos en C y otro menos conocido de Hernández, Lázaro, Dormido y Ros., Estructuras de Datos y Algoritmos., Prentice Hall., 2000.

Los dos son muy básicos, pero a mí, ahora mismo, me supone un cierto esfuerzo recuperar conocimientos que en su día tuve y se han ido "enfriando". El segundo de ellos, creo recordar, era el texto de referencia en la UNED y me dejó buena impresión. El primero es más "de juguete".

Entre ésto, programar, (que los árboles no nos impida ver el bosque), y estudiar el "Perl sin errores" tengo las horas bien ocupadas. Por cierto que éste último es un libro magnífico, en mi opinión, que tendré que volver a leer cuando me atreva a decir que sé Perl. Por ahora entiendo lo básico y me asomo a un montón de cosas que me estoy perdiendo.

Un saludo
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Anterior

Volver a Básico

¿Quién está conectado?

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