[SP-pm] Variavel somente leitura

Lucas Mateus lucasmateus.oliveira em gmail.com
Segunda Abril 28 08:15:03 PDT 2008


Achei esse barato aki, o que acham ?

my $host = 'localhost';

Internals::SvREADONLY($host => 1);  # lock $host
print eval { $host = '10.1.1.1' } ?  "O valor de \$host foi alterado\n" :
"O valor de \$host nao pode ser alterado\n";

Internals::SvREADONLY($host => 0);  # unlock $host
print eval { $host = '10.1.1.1' } ?  "O valor de \$host foi alterado\n" :
"O valor de \$host nao pode ser alterado\n";




2008/4/28 Luis Motta Campos <luismottacampos em yahoo.co.uk>:

> Lucas Mateus wrote:
> > ## Variavel Global
> > my $host = 'localhost';
> >
> > &func_01;
> > &func_02;
> > &func_03;
> >
> > sub func_01 {
> >      # aqui não posso sobrescrever $host
> > }
> >
> > sub func_02 {
> >      # aqui não posso sobrescrever $host
> > }
> >
> > sub func_03 {
> >      # aqui eu devo sobrescrever $host
> > }
> >
> >
> > Conforme o exemplo acima, tenho uma váriavel que não pode ser alterada
> > exceto por uma função. Como garantir que isso aconteça, ja que para esse
> > caso não posso utilizar *"use constant"* ?
>
> O que você está procurando são closures.
>
> {
>  my $host;
>
>  sub set_host {
>    $host = shift;
>  }
>
>  sub get_host {
>    return $host;
>  }
> }
>
> sub pode_ler_host {
>  # recupera a função que dá acesso ao valor de host
>  my $host_accessor = shift;
>  my $host = $host_accessor->(); # pega $host
>  # usa $host
> }
>
> sub pode_escrever_host {
>  my $host_accessor = shift;
>  my $host = 'localhost';
>  $host_accessor->( $host );
> }
>
> sub pode_ler_e_escrever_host {
>  my ( $host_getter, $host_setter ) = @_;
>  # pega host:
>  my $host = $host_getter->();
>  $host =~ s/o/a/g; # altera
>  $host_setter->( $host );
> }
>
> E aí, pode passar os métodos que acha que o cara pode usar:
>
> pode_ler_host( \&get_host );
> pode_escrever_host( \&set_host );
> pode_ler_e_escrever_host( \&get_host, \&set_host );
>
> Isso, mais pacotes (para você poder importar os métodos dentro dos
> pacotes das pessoas que querem ler das tuas variáveis) é o que você pode
> disponibilizar como interface.
>
> Lembre-se de que isso não é segurança, é apenas separação.
>
> Se você quer segurança, precisa do Safe::World, e restringir que
> bytecodes os programas que você vai rodar podem ou não podem usar.
>
> Espero que isso te ajude.
> Putamplexos!
> --
> Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
> Perl fanatic evangelist, and amateur {cook, photographer}
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080428/6ec96e7a/attachment-0001.html 


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