Achei esse barato aki, o que acham ?<br>
<br>
my $host = &#39;localhost&#39;;<br>
<br>
<span class="nfakPe">Internals</span>::SvREADONLY($host =&gt; 1);&nbsp; # lock $host<br>


print eval { $host = &#39;<a href="http://10.1.1.1">10.1.1.1</a>&#39; } ?&nbsp; &quot;O valor de \$host foi alterado\n&quot; :&nbsp; &quot;O valor de \$host nao pode ser alterado\n&quot;;<br>
<br>
 <span class="nfakPe">Internals</span>::SvREADONLY($host =&gt; 0);&nbsp; # unlock $host<br>
print eval { $host = &#39;<a href="http://10.1.1.1">10.1.1.1</a>&#39; } ?&nbsp; &quot;O valor de \$host foi alterado\n&quot; :&nbsp; &quot;O valor de \$host nao pode ser alterado\n&quot;;<br><br><br><br><br><div class="gmail_quote">
2008/4/28 Luis Motta Campos &lt;<a href="mailto:luismottacampos@yahoo.co.uk">luismottacampos@yahoo.co.uk</a>&gt;:<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>
&gt; ## Variavel Global<br>
&gt; my $host = &#39;localhost&#39;;<br>
&gt;<br>
&gt; &amp;func_01;<br>
&gt; &amp;func_02;<br>
&gt; &amp;func_03;<br>
&gt;<br>
&gt; sub func_01 {<br>
&gt; &nbsp; &nbsp; &nbsp;# aqui não posso sobrescrever $host<br>
&gt; }<br>
&gt;<br>
&gt; sub func_02 {<br>
&gt; &nbsp; &nbsp; &nbsp;# aqui não posso sobrescrever $host<br>
&gt; }<br>
&gt;<br>
&gt; sub func_03 {<br>
&gt; &nbsp; &nbsp; &nbsp;# aqui eu devo sobrescrever $host<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; Conforme o exemplo acima, tenho uma váriavel que não pode ser alterada<br>
&gt; exceto por uma função. Como garantir que isso aconteça, ja que para esse<br>
</div></div>&gt; caso não posso utilizar *&quot;use constant&quot;* ?<br>
<br>
O que você está procurando são closures.<br>
<br>
{<br>
 &nbsp;my $host;<br>
<br>
 &nbsp;sub set_host {<br>
 &nbsp; &nbsp;$host = shift;<br>
 &nbsp;}<br>
<br>
 &nbsp;sub get_host {<br>
 &nbsp; &nbsp;return $host;<br>
 &nbsp;}<br>
}<br>
<br>
sub pode_ler_host {<br>
 &nbsp;# recupera a função que dá acesso ao valor de host<br>
 &nbsp;my $host_accessor = shift;<br>
 &nbsp;my $host = $host_accessor-&gt;(); # pega $host<br>
 &nbsp;# usa $host<br>
}<br>
<br>
sub pode_escrever_host {<br>
 &nbsp;my $host_accessor = shift;<br>
 &nbsp;my $host = &#39;localhost&#39;;<br>
 &nbsp;$host_accessor-&gt;( $host );<br>
}<br>
<br>
sub pode_ler_e_escrever_host {<br>
 &nbsp;my ( $host_getter, $host_setter ) = @_;<br>
 &nbsp;# pega host:<br>
 &nbsp;my $host = $host_getter-&gt;();<br>
 &nbsp;$host =~ s/o/a/g; # altera<br>
 &nbsp;$host_setter-&gt;( $host );<br>
}<br>
<br>
E aí, pode passar os métodos que acha que o cara pode usar:<br>
<br>
pode_ler_host( \&amp;get_host );<br>
pode_escrever_host( \&amp;set_host );<br>
pode_ler_e_escrever_host( \&amp;get_host, \&amp;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>