Esto es... no sé qué es. Es una chanchada. Es otro forma de sacar sigils. No creo que deba usarse, pero acá está:
Cuando uno usa objetos en perl (sean hechos con Moo(se) o de cualquier otra forma) (pero hay que usar Moo(se) :) ), hace algo así:
use MiClase;
my $objeto = MiClase->new();
Y después usamos los atributos y métodos de $objeto. Supongamos que sirve para guardar frases célebres:
use Quote;
my $q = Quote->new();
$q->set_phrase("Un problema imaginario es la raíz de
todo pensamiento negativo");
print "La frase es: " . $q->get_phrase . "\n";
Con esto podemos tener (instanciar) un montón de objetos "Quote".
my $q = Quote->new();
my $otra_q = Quote->new()
my $otro = Quote->new()
Pero también podríamos evitar los sigils, no instanciando (creando) un objeto, sino usando la clase. Esto es horrible, y no debe hacerse, pero WTH, lo hago igual :)
use Quote;
Quote->set_phrase("Un problema imaginario es la raíz de
todo pensamiento negativo");
print Quote->get_phrase() . "\n";
Este es el código de Quote.pm
package Quote;
use strict;
our $self;
# Cuando se llama a la clase directamente, el primer argumento
# es justamente el nombre de la clase. No nos interesa.
sub set_phrase {
my $class = shift;
my $phrase = shift;
$self->{phrase} = $phrase;
}
sub get_phrase {
my $class = shift;
return $self->{phrase};
}
1;
Sinceramente, no sé cuán horrible es esto. Qué efectos secundarios tendrá. Le encontré por lo menos una, que es que la clase/objeto es global. Osea, si le ponés un valor a la frase, lo va a tener dentro de toda sub. Supongo que hay alguna forma de cambiarlo. Les dejo un gato: