[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