[SP-pm] Módulo

Adriano Ferreira a.r.ferreira em gmail.com
Segunda Março 5 09:56:05 PST 2007


Sugiro que leia estas páginas de perldoc

           perlboot            Perl OO tutorial for beginners
           perltoot            Perl OO tutorial, part 1
           perltooc            Perl OO tutorial, part 2

Aí você vai entender a maioria dos pontos desta reescrita do seu código:

# arquivo: UGLY.pm

package UGLY;
use strict;

sub new {
    my $proto = shift;
    my $class = ref $proto || $proto;
    my $self = bless {}, $class;
    $self->oi(3);
    return $self;
}

sub oi {
    my $self = shift;
    if (@_) { # setter, usado assim: $ugly->oi($novo_oi);
        $self->{oi} = shift;
    }
    return $self->{oi};
}


# arquivo: teste.pl

use lib qw(.); # o mesmo que BEGIN { unshift (@INC, "."); }
my $jj = UGLY->new();

print $jj->{oi}, "\n"; # ou
print $jj->oi, "\n";

# e também
$jj->oi("isto nao e' tres");
print $jj->oi, "\n";


Para falar a verdade, você pode fazer o código de UGLY ficar bem mais
conciso se usar classes que lhe ajudam com o construtor, getters e
setters, como Class::Accessor. O código a seguir faz basicamente a
mesma coisa que escrevi acima.

# arquivo: UGLY.pm

package UGLY;

use strict;
use warnings; # sempre use!

use base qw(Class::Accessor);
UGLY->mk_accessors( qw(oi tchau));

# e agora você pode fazer

use lib qw(.);
use UGLY;
my $ugly = UGLY->new( { oi => "Hello, world!" } );
print $ugly->oi, "\n";
$ugly->oi("Oi, tudo bem!"); # atualizando o atributo oi

$ugly->tchau("Até mais!");

On 3/5/07, Thomas Britis <thomas at tcnet.com.br> wrote:
> Senhores,
>
>         Apenas como complemento:
>
>         Eu sei que se eu fizer:
>
> $jj = $jj->bla ($jj);
>
> e fizer na função bla() do PM:
> sub bla {
>   my $self = shift;
>
>   $self->{tchau} = 10;
>   return $self;
> }
>
> eu vou ter o valor que quero. Porém, o que eu quero saber é se posso
> mexer no $jj sem ter que retorná-lo. Assim como pode ser feito em C.
>
>         Obrigado.
>
> Thomas Britis wrote:
> > Senhores,
> >
> >       Tenho uma pequena dúvida e com certeza vcs podem me ajudar.
> >
> >       Fiz um pequeno teste da seguinte forma:
> >
> > arquivo: UGLY.pm
> >
> > package UGLY;
> > use strict;
> >
> > sub new {
> >   my $self = {};
> >
> >   bless $self;
> >
> >   $self->{oi} = 3;
> >   return $self;
> > }
> >
> > arquivo: teste.pl
> >
> > BEGIN { unshift (@INC, "."); }
> > my $jj = UGLY->new();
> >
> > print $jj->{oi}, "\n";
> >
> > Pois bem, imprimiu o 3 como devido. Minha dúvida é: eu posso trabalhar
> > com a mesma variavel jj (que é o $self retornado pelo new() do módulo)
> > DENTRO do módulo? Explico:
> >
> > Além da função new() no módulo eu tivesse:
> > sub bla {
> >   my $self = shift;
> >
> >   $self->{tchau} = 10;
> > }
> >
> > e chamasse no teste.pl:
> > $jj->tchau UGLY;
> > ou ainda:
> > $jj->tchau ($jj);
> > ou sei lá o que, mas que eu tivesse no arquivo pl (e não no módulo) o
> > retorno da função bla, ou seja:
> > print $jj->{tchau}, "\n";
> >
> >       Se fui muito confuso, por favor, me avisem.
> >
> >       Obrigado.
>
> --
> Thomas Storino Britis
> TCNet Informatica e Telecomunicacoes LTDA
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


Mais detalhes sobre a lista de discussão SaoPaulo-pm