• Publicidad

Pregunta de novato

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

Pregunta de novato

Notapor neoranger » 2014-11-19 14:41 @653

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.
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Publicidad

Re: Pregunta de novato

Notapor explorer » 2014-11-19 15:10 @673

__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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pregunta de novato

Notapor neoranger » 2014-11-19 15:58 @707

¡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.
Última edición por explorer el 2014-11-19 16:35 @733, editado 1 vez en total
Razón: admiraciones; interrogaciones; Que => ¿Qué; Como => ?Cómo; cual => cuál;
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: Pregunta de novato

Notapor explorer » 2014-11-19 16:55 @746

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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pregunta de novato

Notapor neoranger » 2014-11-20 08:27 @394

¡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?
Última edición por explorer el 2014-11-20 09:09 @423, editado 1 vez en total
Razón: Muchisimas => Muchísimas; mas => más; estandar => estándar;
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: Pregunta de novato

Notapor explorer » 2014-11-20 09:11 @424

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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pregunta de novato

Notapor neoranger » 2014-11-20 09:29 @437

¡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!!
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382


Volver a Básico

¿Quién está conectado?

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