Achei esse barato aki, o que acham ?<br>
<br>
my $host = 'localhost';<br>
<br>
<span class="nfakPe">Internals</span>::SvREADONLY($host => 1); # lock $host<br>
print eval { $host = '<a href="http://10.1.1.1">10.1.1.1</a>' } ? "O valor de \$host foi alterado\n" : "O valor de \$host nao pode ser alterado\n";<br>
<br>
<span class="nfakPe">Internals</span>::SvREADONLY($host => 0); # unlock $host<br>
print eval { $host = '<a href="http://10.1.1.1">10.1.1.1</a>' } ? "O valor de \$host foi alterado\n" : "O valor de \$host nao pode ser alterado\n";<br><br><br><br><br><div class="gmail_quote">
2008/4/28 Luis Motta Campos <<a href="mailto:luismottacampos@yahoo.co.uk">luismottacampos@yahoo.co.uk</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div class="Wj3C7c">Lucas Mateus wrote:<br>
> ## Variavel Global<br>
> my $host = 'localhost';<br>
><br>
> &func_01;<br>
> &func_02;<br>
> &func_03;<br>
><br>
> sub func_01 {<br>
> # aqui não posso sobrescrever $host<br>
> }<br>
><br>
> sub func_02 {<br>
> # aqui não posso sobrescrever $host<br>
> }<br>
><br>
> sub func_03 {<br>
> # aqui eu devo sobrescrever $host<br>
> }<br>
><br>
><br>
> Conforme o exemplo acima, tenho uma váriavel que não pode ser alterada<br>
> exceto por uma função. Como garantir que isso aconteça, ja que para esse<br>
</div></div>> caso não posso utilizar *"use constant"* ?<br>
<br>
O que você está procurando são closures.<br>
<br>
{<br>
my $host;<br>
<br>
sub set_host {<br>
$host = shift;<br>
}<br>
<br>
sub get_host {<br>
return $host;<br>
}<br>
}<br>
<br>
sub pode_ler_host {<br>
# recupera a função que dá acesso ao valor de host<br>
my $host_accessor = shift;<br>
my $host = $host_accessor->(); # pega $host<br>
# usa $host<br>
}<br>
<br>
sub pode_escrever_host {<br>
my $host_accessor = shift;<br>
my $host = 'localhost';<br>
$host_accessor->( $host );<br>
}<br>
<br>
sub pode_ler_e_escrever_host {<br>
my ( $host_getter, $host_setter ) = @_;<br>
# pega host:<br>
my $host = $host_getter->();<br>
$host =~ s/o/a/g; # altera<br>
$host_setter->( $host );<br>
}<br>
<br>
E aí, pode passar os métodos que acha que o cara pode usar:<br>
<br>
pode_ler_host( \&get_host );<br>
pode_escrever_host( \&set_host );<br>
pode_ler_e_escrever_host( \&get_host, \&set_host );<br>
<br>
Isso, mais pacotes (para você poder importar os métodos dentro dos<br>
pacotes das pessoas que querem ler das tuas variáveis) é o que você pode<br>
disponibilizar como interface.<br>
<br>
Lembre-se de que isso não é segurança, é apenas separação.<br>
<br>
Se você quer segurança, precisa do Safe::World, e restringir que<br>
bytecodes os programas que você vai rodar podem ou não podem usar.<br>
<br>
Espero que isso te ajude.<br>
<div><div></div><div class="Wj3C7c">Putamplexos!<br>
--<br>
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,<br>
Perl fanatic evangelist, and amateur {cook, photographer}<br>
<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br>