• Publicidad

Ayuda con un módulo

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Ayuda con un módulo

Notapor Sismetic » 2009-09-17 09:49 @450

Hola a todos. Necesito ayuda con un módulo que hice y lo exporté, pero en otro programa en el que lo uso, me dice que una función no está declarada, pero si dentro de la función le pongo print(), sí me lo imprime, está medio raro. Gracias de antemano, aquí les va el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package Monsters;
  2.  
  3. use strict;
  4. use Exporter;
  5.  
  6. our @ISA= qw(Exporter);
  7. our @Export = qw(Get_Monster Rand_Monster Data_Monster Monster);
  8. sub Get_Monster{
  9.  
  10.    open my $FILE, '<', 'mon.txt' or die $!;
  11.    next if !$FILE;
  12.    my @monsters = <$FILE>;
  13.    return @monsters;
  14.  
  15. }
  16.  
  17. sub Rand_Monster{
  18.  
  19.     my @monsters = Get_Monster();
  20.     my $rand = int(rand(@monsters));
  21.     my $random_monster = $monsters[$rand];
  22.     return $random_monster;
  23.  
  24. }
  25.  
  26. sub Data_Monster{
  27.  
  28.     my $monster = Rand_Monster();
  29.     my @monster_data = split(',', $monster);
  30. }
  31.  
  32. sub Monster{
  33.  
  34.     my @data = Data_Monster();
  35.     #Entonces aca deberia poner return @data?
  36. }
  37. Monster();
  38. # Y este Monster() es para que ejecute la funcion Monster, que ejecuta Data_Monster que ejecuta Rand_Monster que ejecuta Get_Monster, porque segun yo si pones las funciones nada mas la declaras pero no la ejecuta, eso lo hize nada mas para probar que todo estaba bien
  39.  
  40. #Y si tengo otro script que es el usa el modulo, va algo asi
  41.  
  42. use Monsters;
  43.  
  44. my @monstruo = Monster()
  45.  
  46. #Lo raro es que en la parte donde te pone el warning, si le pongo print en la funcion de adentro del modulo, me pone el nombre del monstruo su vida y su ataque(como esperaba), pero si se lo quito e imprimo @monstruo, me dice que Monster() no esta declarada, seguro que es un error mio, pero no lo pesco :S
  47.  
  48. 1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Gracias por ayudar, si hice algo mal me lo podrían decir para mejorar, por favor :)
Última edición por Sismetic el 2009-09-19 14:50 @660, editado 2 veces en total
La mejor religion es la verdad
Avatar de Usuario
Sismetic
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2009-08-26 20:01 @875

Publicidad

Re: Ayuda con un módulo

Notapor creating021 » 2009-09-17 15:25 @684

Bueno, es que es raro lo que estás haciendo para probar el código... generalmente uno no llama a una subrutina así como así dentro de un módulo, es mejor hacerlo de la siguiente forma.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
package MiModulo;
use strict;
use Exporter;
 
our @ISA= qw(Exporter);
our @Export = qw(Mensaje Imprimir);

sub Mensaje {
    return "Hola mundo";
}

sub Imprimir {
    my $msg = shift;
    print "$msg\n";
}

package main;

my $mensaje = Mensaje();
Imprimir( $mensaje );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


O usar un script que use el módulo, aparte de eso Data_Monster() no devuelve nada, Monster() tampoco.

Sería bueno ver el error (completo).
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

Re: Ayuda con un módulo

Notapor explorer » 2009-09-18 12:06 @546

Bienvenido a los foros de Perl en Español, Sismetic.

La sintaxis del módulo es correcta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> perl -c Monsters.pm
Monsters.pm syntax OK
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Con este programa, me funciona perfectamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use Monsters;

print join ",", Monster();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Ojo!, el módulo se llama Monsters, pero la función se llama Monster (sin 's' final).

Además, veo cosas raras:

  • En la línea 36 llamas a una función definida justo antes. Eso está bien si quieres inicializar algún variable o cualquier otra operación de inicialización del módulo. No suele ser lo normal, pero es válido. De todas maneras, en tu caso, no sirve para nada, pues su resultado se pierde.
  • De la 32 a la 34 defines la función Monster, que se encarga de llamar a otra función. El resultado se guarda en la variable local @data, que DESAPARECE al final de la función. Ahora bien, como NO hay return(), el resultado de la función es el de la ÚLTIMA sentencia ejecutada, así que, por chiripa, la función devuelve el resultado de la llamada a Data_Monster().
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: Ayuda con un módulo

Notapor explorer » 2010-05-06 14:12 @633

Para que un programa encuentre los módulos que va a necesitar, deben estar en alguno de los directorios indicados por la variable @INC. Usa perl -V para ver cuáles son en tu sistema. Observa que uno de ellos es '.', que significa que puede estar en el mismo directorio que el programa.

Si quieres instalarlos en otro sitio, puedes usar 'use lib' para indicar dónde.

Tienes más información en tu propio ordenador, en perldoc:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
           perlmod             Módulos Perl: cómo funcionan
           perlmodlib          Módulos Perl: cómo escribir y usar
           perlmodstyle        Módulos Perl: cómo escribir módulos con estilo
           perlmodinstall      Módulos Perl: cómo instalarlos desde CPAN
           perlnewmod          Módulos Perl: preparando un nuevo módulo para su distribución
Coloreado en 0.000 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

Re: Ayuda con un módulo

Notapor marcmb » 2010-05-06 14:25 @642

Gracias, había eliminado el post para ponerlo en un nuevo hilo porque no sabía si leerías el post en un tema resuelto, pero veo que sí :) voy a ponerme de inmediato a ver la información de perldoc. Por cierto, podrías hacer un pequeño tutorial de cómo instalarlos en Linux, ya que el ppm.exe, como que va a ser que no :lol:

Bueno, me voy a ver todo esto y seguro que pronto volveré por aquí en alguna duda nueva que me surja (me lo huelo).

Muchas gracias, como siempre, por tu valiosa ayuda, explorer.
Última edición por explorer el 2010-05-06 16:31 @730, editado 1 vez en total
Razón: Ortografía, anglicismos, abreviaturas telefónicas
Avatar de Usuario
marcmb
Perlero nuevo
Perlero nuevo
 
Mensajes: 55
Registrado: 2010-05-03 07:42 @362
Ubicación: Girona

Re: Ayuda con un módulo

Notapor explorer » 2010-05-06 16:32 @731

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


Volver a Módulos

¿Quién está conectado?

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

cron