Página 1 de 1

Pregunta de novato

NotaPublicado: 2014-11-19 14:41 @653
por neoranger
Amigos, tengo este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. __PACKAGE__->meta->make_immutable;
  2.  
  3. package Result;
  4.  
  5. sub new {
  6.                 my $class = shift;
  7.                 my $self = bless {
  8.                         'error' => shift,
  9.                         'message' => shift,
  10.                         'userid' => shift
  11.                         }, $class;
  12.                 return $self;
  13. }
  14.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Me podrían explicar las diferencias entre __PACKAGE__-> y package Result?

¿Y me podrían explicar bien para qué se usa el bless()? No encuentro una definición certera por ningún lado.

Re: Pregunta de novato

NotaPublicado: 2014-11-19 15:10 @673
por explorer
__PACKAGE__ es una "directiva de compilación" (mejor dicho, "token") que Perl sustituye por el nombre del paquete actual.

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.18;
  3.  
  4. say __PACKAGE__;
  5.  
  6. package Prueba;
  7.  
  8. say __PACKAGE__;
  9.  
  10. package Result;
  11.  
  12. say __PACKAGE__;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
main
Prueba
Result
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Más información en perldoc -f __PACKAGE__
Más información en perldoc -q "calling package"

Y lo de package Result; lo que indica es el comienzo de (la definición de) un paquete. Si un programa no tiene package, pues se sobreentiende que es el main (ver ejemplo anterior).

Más información en tu propio ordenador en perldoc perlmod, y en la Web (traducido al español).

Re: Pregunta de novato

NotaPublicado: 2014-11-19 15:58 @707
por neoranger
¡Genial! ¡Gracias! ¿¿Y por el tema de bless()?? ¿Qué significa?

Dedujimos que es una indicación de estancia para un clase, por ejemplo, si yo hago:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultado = new Result ($error, $message, $userid);
  2.  
  3. package Result;
  4.  
  5. sub new {
  6.                 my $class = shift;
  7.                 my $self = bless {
  8.                         'error' => shift,
  9.                         'message' => shift,
  10.                         'userid' => shift
  11.                         }, $class;
  12.                 return $self;
  13. }
  14.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Con el bless() se indica que error, message y userid son instancias de Result?

¿Qué se guarda en $class? ¿La clase? ¿Cómo sabe cuál es la clase si yo le paso solo los otros tres escalares?

Gracias.

Re: Pregunta de novato

NotaPublicado: 2014-11-19 16:55 @746
por explorer
Te recomiendo que le eches un vistazo al hilo Buscar documentación de Perl ;)

Para el tema de bless: perldoc -f bless

Lo que hace bless es "bautizar" (bendecir) una referencia (a un escalar, a un hash, a un array, a...) con un nombre (un nombre de clase).

Entonces, el código hace lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultado = Result->new($error, $message, $userid);         # Llamamos a un método de clase (new) dentro del paquete Result
  2.                                                                 # new() recibe 4 argumentos: 'Result', $error, $message y $userid
  3.                                                                 # El primer argumento es 'Result' porque es el 'objeto' o 'clase'
  4.                                                                 # sobre el que se aplica el método (lo hace Perl por la presencia de '->')
  5.  
  6. package Result;                                                 # Comienzo de la clase Result
  7.  
  8. sub new {                                                       # Comienzo de la definición del método new()
  9.     my $class = shift;                                          # $class valdrá 'Result'
  10.     my $self  = bless                                           # $self almacenará el objeto bendecido que vamos a crear
  11.                 {                                               # La llave inicia una ref. a un hash anónimo
  12.                        'error'   => shift,                      # componentes del hash: pares clave/valor
  13.                        'message' => shift,                      # shift() va sacando los argumentos pasados al método
  14.                        'userid'  => shift,
  15.                 }, $class;                                      # el hash es bendecido con el nombre guardado en $class
  16.  
  17.     return $self;                                               # devolvemos el objeto bendecido. Mejor dicho: estamos devolviendo un valor
  18.                                                                 # que es una ref. a un objeto de la clase Result.
  19.                                                                 # El espacio reservado con el 'my $self' será liberado cuando el objeto deje
  20.                                                                 # de ser usado en el programa principal ($resultado salga de su contexto).
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en tu propio ordenador en perldoc perlobj, y en la Web (traducido al español).

Más información en tu propio ordenador en perldoc perlootut, y en la Web (traducido al español).

Re: Pregunta de novato

NotaPublicado: 2014-11-20 08:27 @394
por neoranger
¡Muchísimas gracias! Excelente respuesta. Estábamos más o menos en lo cierto.

Otra pregunta (prometo que voy a leer la documentación, el problema es que me llevo mal con el inglés): ¿$class y $self son escalares reservados de Perl? ¿O es un estándar que se usa hace tiempo?

Re: Pregunta de novato

NotaPublicado: 2014-11-20 09:11 @424
por explorer
Si tienes problemas con el inglés, fíjate que te he puesto enlaces a las versiones traducidas :) Ejemplo: perldoc perlintro, y en la Web (traducido al español).

Los nombres de las variables escalares son totalmente arbitrarios, puedes usar el que quieras.

Lo que pasa es que se intenta que el nombre de la variable refleje su contenido, o al menos, asemejarlo a lo que se utiliza en otros lenguajes. Por eso el uso del $self, pero vamos, puedes llamarlo como quieras ($objeto, por ejemplo).

Re: Pregunta de novato

NotaPublicado: 2014-11-20 09:29 @437
por neoranger
¡Perfecto! Genial, gracias por la aclaración. Como dije, prometo leer la documentación (en español, obviamente :P ) y empezar a hacer preguntas concretas más allá de las preguntas de un newbie, ¡jejeje!

¡¡Saludos!!