• Publicidad

Creación de objetos

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

Creación de objetos

Notapor batussay » 2007-10-11 11:59 @541

Hola amigos

Soy nuevo en programación en Perl. Ahora estoy aprendiendo la parte de Programación orientada a objetos en Perl pero se me presenta el siguiente problema con un programa explicativo que encontré en Internet pero me manda el siguiente error:

Código: Seleccionar todo
Persona.pm did not return a true value at C:\Archivos de programa\OptiPerl53\Webroot\cgi-bin\prueba.cgi line 2.

BEGIN failed--compilation aborted at C:\Archivos de programa\OptiPerl53\Webroot\cgi-bin\prueba.cgi line 2.


La clase es Persona.pm. Aquí no me manda ningún error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 package Persona;
 use strict; #Nos ponemos serios

  sub new {
     my $this=shift; #Cogemos la clase que somos o una referencia a la clase (si soy un objeto)
     my $class = ref($this) || $this; #Averiguo la clase a la que pertenezco

     my $self={}; #Inicializamos la tabla hash que contendrá las var. de instancia (NOMBRE Y EDAD)
     $self ->{NOMBRE} =undef ; #La clase Persona nace sin nombre
     $self ->{EDAD}   =0 ;     #La clase Persona se construye con 0 años

     bless $self, $class; #Perl nos tiene que dar el visto bueno (bendecirla)
     return ($self); #Devolvemos la clase recién construida
  }

  ######################################################################
  #Métodos de acceso a los datos de la clase
  #

  #metodo para ver/cambiar el nombre
  sub nombre{
       my $self=shift; #El primer parámetro de un metodo es la  clase

       #Miramos si se le ha pasado algún parámetro, en cuyo caso será el nombre
       $self->{NOMBRE}=shift if (@_);

       #Devolvemos el nombre
       return $self->{NOMBRE};
  }

  #metodo para ver/cambiar la edad
  sub edad{
       my $self=shift; #El primer parámetro de un metodo es la  clase

       #Miramos si se le ha pasado algún parámetro, en cuyo caso será la edad
       $self->{EDAD}=shift if (@_);

       #Devolvemos el nombre
       return $self->{EDAD};
  }

  ######################################################################
  #Métodos de la clase
  #

  #metodo para cumplir años
  sub cumple{
       my $self=shift; #El primer parámetro de un metodo es la  clase

       #Incrementamos la edad
       $self->{EDAD}++;

       #Devolvemos el nombre
       return $self->{EDAD};
  }


  ######################################################################
  #Destructor
  #

  sub DESTROY {
        my $self=shift; #El primer parámetro de un metodo es la  clase
        delete ($self->{NOMBRE});
        delete ($self->{EDAD});

  }

  #Fin
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y el programa es prueba.cgi:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#use strict;
use Persona;

  #Creamos un objeto del tipo persona
 my  $uno= Persona->new();

  #Vamos a darle un nombre a ese objeto, usando el método nombre
  $uno->nombre("Richal");

  #También vamos a darle una edad, usando el método edad
  $uno->edad(23);

  #Mostramos la edad y el nombre
  print $uno->nombre." tiene ".$uno->edad. " años \n";

  #¿Y si hoy fuera su cumpleaños?
  $uno->cumple;

  #Mostramos la edad y el nombre
  print $uno->nombre." acaba de cumplir ".$uno->edad. " años \n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Estoy usando :
Código: Seleccionar todo
ActivePerl-5.8.8.820-MSWin32-x86-274739
OptiPerl-5.3


Y no sé qué debo hacer para que no me mande ese error, disculpen la ignorancia pero este error me trae loco.
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249

Publicidad

Notapor batussay » 2007-10-11 12:18 @554

Bueno, revisando más páginas encontré una repuesta y es que al final de la clase debo poner el valor de 1;. Lo probé y el programa por fin funciona; lo que no sé es es por qué debe ponerse eso al final de la clase.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
.......................
........................

 sub DESTROY {
        my $self=shift; #El primer parámetro de un metodo es la  clase
        delete ($self->{NOMBRE});
        delete ($self->{EDAD});

  }
 1;
  #Fin
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249

Notapor Kiloko » 2007-10-11 12:30 @563

¿Y si pones 0 funciona?
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor batussay » 2007-10-11 13:07 @588

Si pongo 0 no funciona. Me manda error: "Persona.pm did not return a true value"
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249

Notapor explorer » 2007-10-11 15:04 @669

Es una exigencia del 'use'.

El módulo o paquete cargado por use debe devolver un valor 'true' para que, de alguna manera, el 'use' sepa que la carga e inicialización del módulo ha ido bien.

Por eso, en la mayoría de los módulos, como están compuestos de métodos, no hay realmente una inicialización o ejecución de código, en el momento de la carga. Por eso, casi todos, añaden el 1; al final, pues se trata de una sentencia ejecutable, que Perl la evalúa, y, como es la última, es el valor que devuelve a 'use'.

Más información, en la parte de require.
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 batussay » 2007-10-11 17:53 @786

OKs gracias por la explicación.
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249


Volver a Básico

¿Quién está conectado?

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