<div dir="ltr">Caramba até eu entendi agora a história do escopo, e nem precisou desenhar&nbsp; ;-) !<br><br>Solli M. Honório<br><br><div class="gmail_quote">2008/7/28 Luis Motta Campos <span dir="ltr">&lt;<a href="mailto:luismottacampos@yahoo.co.uk">luismottacampos@yahoo.co.uk</a>&gt;</span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">Agustinho Coelho wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Agora o que eu não entendi direito e quando eu devo usar a declaração<br>
de *my / local / our*. Eu pesquisei e entendi que *my* define um<br>
escopo próprio, *our* um escopo global e *local* como escopo<br>
dinâmico. Mas o que são esses escopos? Eu tenho que declarar toda<br>
hora ? Por. Exemplo:<br>
<br>
#!/usr/bin/perl -w<br>
use strict; use warnings;<br>
print &quot;Digite: &quot; chomp ( *my* $var1 = &lt;STDIN&gt; );<br>
print &quot;*my* $var1\n&quot;;<br>
</blockquote>
<br></div>
Agostinho<br>
<br>
Vou tentar te dar um exemplo prático, mas pode ficar meio comprido:<br>
<br>
Chamamos &quot;escopo&quot; o maior bloco sintático que envolve uma variável.<br>
Bloco sintático, em Perl, é normalmente delimitado por &quot;{&quot; e &quot;}&quot;. Por exemplo, todo comando de loop tem um bloco sintático (explícito ou implícito) associado com ele:<br>
<br>
foreach my $item ( @compras ){ # Escopo do &quot;foreach&quot;\<br>
 &nbsp;process_shopping_item( $item );<br>
} # final do escopo do &quot;foreach&quot;<br>
<br>
ou<br>
<br>
sou_um_unico_comando_mas_estou_no_escopo_do() foreach ( @coisas );<br>
<br>
ou mesmo<br>
<br>
{ # olha, um bloco sem loop!<br>
 &nbsp;my $aqui = &#39;dentro do escopo&#39;;<br>
 &nbsp;faz_coisas_com( $aqui );<br>
} # terminou o escopo-sem-loop!<br>
<br>
Note que as variáveis $item (no primeiro foreach) e $aqui (no último exemplo) pertencem a escopos explícitos.<br>
<br>
Quando definimos uma variável com &quot;my&quot;, ela existe apenas dentro do bloco sintático que contém o escopo onde ela está definida:<br>
<br>
foreach my $item ( @compras ){<br>
 &nbsp;# $item existe aqui dentro...<br>
}<br>
# ... mas não existe aqui fora.<br>
<br>
Isso encerra a compreensão de escopo e my.<br>
<br>
Agora vamos tentar explicar a diferença de &quot;my&quot; e &quot;local&quot;. São muito parecidas, mas tem uma diferença sutil. &quot;my&quot; declara uma variável associada com um escopo. Quando o bloco sintático que contém o escopo termina de executar, o escopo associado é destruído, e a variável vai junto com ele.<br>

<br>
&quot;local&quot; fucniona como &quot;my&quot;, mas não declara uma variável associada com o escopo. Ao invés disso, &quot;local&quot; arranja para que o valor original da variável seja re-colocado quando o bloco sintático onde está a declaração &quot;local&quot; terminar e o escopo associado for destruído.<br>

<br>
Por exemplo:<br>
<br>
#!/usr/bin/perl<br>
use strict;<br>
use warnings;<br>
our $valor;<br>
{<br>
 &nbsp;local $valor = 10;<br>
 &nbsp;{<br>
 &nbsp; &nbsp;local $valor = 20;<br>
 &nbsp; &nbsp;print qq{Valor: $valor\n}; &nbsp;# 20<br>
 &nbsp;}<br>
 &nbsp;print qq{Valor: $valor\n}; # 10<br>
}<br>
<br>
Aqui, temos um exemplo de uso de &quot;local&quot; e &quot;our&quot; bem educativo.<br>
Se você substituir &quot;our&quot; por &quot;local&quot;, o Perl vai reclamar que não existe declaração da variável &quot;$valor&quot;:<br>
<br>
#!/usr/bin/perl<br>
use strict;<br>
use warnings;<br>
local $valor;<br>
{<br>
 &nbsp;local $valor = 10;<br>
 &nbsp;{<br>
 &nbsp; &nbsp;local $valor = 20;<br>
 &nbsp; &nbsp;print qq{Valor: $valor\n}; &nbsp;# 20<br>
 &nbsp;}<br>
 &nbsp;print qq{Valor: $valor\n}; # 10<br>
}<br>
<br>
termina com montes de erros &quot;Global symbol &#39;$valor&#39; requires explicit package name at...&quot;<br>
<br>
O que &quot;our&quot; faz é declarar uma variável mais ou menos como &quot;my&quot;, mas, ao invés de associar a variável com o escopo léxico (o bloco sintático, lembra?) ela associa com o pacote. Isso quer dizer que todo o código que pertence ao mesmo pacote pode ver a variável, mesmo que em arquivos diferentes, e que todo o código dentro do arquivo também pode ver a variável.<br>

<br>
Agora, eu acho que você já sabe o bastante para começar a brincar.<br>
Por favor não se acanhe e pergunte qualquer coisa que você não compreendeu até agora.<br>
Lembre-se: isso não é toda a informação, é apenas uma introdução rápida para o mecanismo... :)<br>
<br>
Putamplexos!<br><font color="#888888">
-- <br>
Luis Motta Campos is a software engineer,<br>
Perl Programmer, foodie and photographer.</font><div><div></div><div class="Wj3C7c"><br>
_______________________________________________<br>
Cascavel-pm mailing list<br>
<a href="mailto:Cascavel-pm@pm.org" target="_blank">Cascavel-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/cascavel-pm" target="_blank">http://mail.pm.org/mailman/listinfo/cascavel-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>
</div>