[SP-pm] Variavel somente leitura
Luis Motta Campos
luismottacampos em yahoo.co.uk
Segunda Abril 28 07:55:01 PDT 2008
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}
Mais detalhes sobre a lista de discussão SaoPaulo-pm