• Publicidad

Hacer un módulo

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

Hacer un módulo

Notapor gonzalos » 2009-12-21 17:25 @767

Hola a todos.

Volvemos al ataque. Yo también quiero hacerme famoso colgando módulos de Perl (es broma) y estoy intentando hacer uno. Y tengo algunas dudas, sobre todo a la hora de leer los datos para escribirlos en el archivo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
package volumen;
use strict;
use warnings;
use diagnostics;

use File::Slurp;
use Exporter;

our @ISA = qw(Exporter);
our @EXPORT = qw( lee escribe );
our $VERSION = 0.01;

#Declaramos las variables
my @volumen_cono;
my @datos_cono;
my $nombre_archivo;
my $lineas;
my $renglones;
my $datos_cono;
my $final;


#Leemos el archivo que contiene los datos

sub lee{
        $nombre_archivo=shift;
        @volumen_cono=open (FILE, "<$nombre_archivo") || die "no se puede leer fichero";
       
        while ($lineas=@volumen_cono){
                push @datos_cono, split(/\s+/,$lineas);
               
        }
        close (FILE);
        return \@datos_cono;   
}
# Leemos los datos
sub escribe {
       $nombre_archivo = shift;
       $datos_cono = shift;
       $final = '';
       
        while ($renglones=@volumen_cono) {
                $final= join(" ",$renglones );
               
        }
#Escribimos el fichero
    open (FILE, ">$nombre_archivo" );
    print FILE $final;  
        close(FILE);
}

1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y aquí os dejo el programa principal, que hace la llamada al módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;
use volumen;
 
my $datos_cono = [ ['2','3']];
escribe( "datos.dat", $datos_cono );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En este ejemplo, me crea el archivo pero está vacío y no sé en qué me falla. El script lo he hecho con más subrutinas de las que necesito sobre todo para practicar.

Un saludo,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Publicidad

Re: Hacer un módulo

Notapor explorer » 2009-12-21 18:12 @800

while ($lineas=@volumen_cono)

No creo que se eso lo que quieres hacer...

Cuando un arreglo (@volumen_cono) lo evalúas en contexto escalar (como es este caso), lo que obtienes es el número de elementos del arreglo, NO el contenido del arreglo.

Habrás querido hacer...

for $lineas (@volumen_cono) {
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: Hacer un módulo

Notapor salva » 2009-12-22 02:45 @156

gonzalos escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@volumen_cono=open (FILE, "<$nombre_archivo") || die "no se puede leer fichero";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esta línea seguro que no hace lo que tu quieres porque la función open devuelve un valor verdadero o falso indicando si la operación ha ido bien o no y no una lista de cosas.

Si lo que quieres es leer todas las líneas del fichero y ponerlas en el array @volumen_cono, eso se hace así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FILE, "<", $nombre_archivo) || die "no se puede abrir el fichero: $!";
@volumen_cono = <FILE>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En cualquier caso, como veo que aun te cuesta hacer cosas básicas en Perl yo te aconsejaría que dejases lo de los módulos para más adelante y por ahora te dedicases a aprender bien las cosas más sencillas.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Hacer un módulo

Notapor explorer » 2009-12-22 04:20 @222

Otra cosa curiosa...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use File::Slurp;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Curioso que incluyas este módulo, pero luego ¡no lo usas! Haces la lectura de los ficheros "a mano".

Ejemplo de cómo quedaría el método leer():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub lee{
    my $nombre_archivo = shift;

    my @volumen_cono = read_file($nombre_archivo);

    foreach my $linea (@volumen_cono) {
        push @datos_cono, split(" ", $linea);
    }

    return \@datos_cono;  
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Hemos sustituido las operaciones de apertura, lectura y cierre del fichero por una función importada por el módulo.

En split(), podemos sustituir el caso /\s+/ por " ", por ser, precisamente, un caso especial, pero sí más claro.

Lo que no está claro es cómo están organizados los datos dentro de @datos_cono.

Según el ejemplo final, es un arreglo de arreglos. En ese caso, está mal escrito el push(), que debería ser, entonces:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
push @datos_cono, [ split(" ", $linea) ];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con la ayuda de los corchetes, "metemos" los elementos de $linea dentro de un arreglo anónimo. Sin ellos, el split() iría soltando los elementos uno a uno, y uno a uno, push() los iría guardando en @datos_cono.

Recuerda: ¡Data::Dumper es tu amigo!
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: Hacer un módulo

Notapor gonzalos » 2009-12-23 05:15 @260

Hola a todos

Gracias por la ayuda. Lo entiendo mejor explicado así que leyéndomelo en un manual.

Salva, el problema con el open fue debido probablemente a que definí la variable, la asocié a un valor. Y luego borré el valor y se juntaron la definición de la variable con la instrucción open(). Además de que me falta practicar los conceptos básicos para asentarlos, mi otro problema es que voy haciendo código en cualquier parte y luego tengo que ir recopilando de cuatro o cinco sitios y al final siempre se me cuelan esos errores.

Explorer hice la llamada al módulo y la asocié a las subrutinas con qw pero no conseguí hacerlo funcionar así que borré el qw() pero no la llamada al módulo.

Esta tarde si tengo un poco de tiempo organizo todo el código y sigo trabajando en él.

Un saludo
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Hacer un módulo

Notapor gonzalos » 2010-01-07 15:30 @687

Hola a todos

Después de estar dos semanas desconectado volvemos el nuevo año con las dudas y a seguir aprendiendo.

Bueno me he leído el Data::Dumper y me ha sonado a chino, lo único que he conseguido es ejecutar el Dumper y que me muestre el valor de la variable por pantalla

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1=[[ ['2','3']]];
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En cuanto a la subrutina que se usa para leer he conseguido que me funcione limpiando los arreglos de la siguiente manera

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub escribe {
    $nombre_archivo = shift;
    $datos_cono = shift;
    $final = '';
       
    foreach my $renglones(@$volumen_cono) {
        $final= join(" ",@$renglones );
    }
    #Escribimos el fichero
    write_file($nombre_archivo,$final);
}
1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y he estado pensando en complicar un poco más el módulo de la siguiente manera.

Que el módulo me lea un archivo con cabeceras de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
radio    altura
        5         2
        3         6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y en el programa principal ejecutar una función que me calculara el volumen de un cono, usando como variables el radio y la altura y con la segunda rutina en un archivo de salida escribir los tres valores.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
radio    altura    volumen
       5          2         28
       3          6         53
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


A ver si busco información de cómo puedo hacerlo. Y así hago el módulo lo más práctico posible y a lo mejor puedo usarlo en mi trabajo.

Un saludo,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283


Volver a Básico

¿Quién está conectado?

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