[Cascavel-pm] Duvida com declaração de variáveis our, my e local

Luis Motta Campos luismottacampos em yahoo.co.uk
Segunda Julho 28 12:28:31 PDT 2008


Agustinho Coelho wrote:
> Agora o que eu não entendi direito e quando eu devo usar a declaração
> de *my / local / our*. Eu pesquisei e entendi que *my* define um
> escopo próprio, *our* um escopo global e *local* como escopo
> dinâmico. Mas o que são esses escopos? Eu tenho que declarar toda
> hora ? Por. Exemplo:
> 
> #!/usr/bin/perl -w
> use strict; use warnings;
> print "Digite: " chomp ( *my* $var1 = <STDIN> );
> print "*my* $var1\n";

Agostinho

Vou tentar te dar um exemplo prático, mas pode ficar meio comprido:

Chamamos "escopo" o maior bloco sintático que envolve uma variável.
Bloco sintático, em Perl, é normalmente delimitado por "{" e "}". Por 
exemplo, todo comando de loop tem um bloco sintático (explícito ou 
implícito) associado com ele:

foreach my $item ( @compras ){ # Escopo do "foreach"\
   process_shopping_item( $item );
} # final do escopo do "foreach"

ou

sou_um_unico_comando_mas_estou_no_escopo_do() foreach ( @coisas );

ou mesmo

{ # olha, um bloco sem loop!
   my $aqui = 'dentro do escopo';
   faz_coisas_com( $aqui );
} # terminou o escopo-sem-loop!

Note que as variáveis $item (no primeiro foreach) e $aqui (no último 
exemplo) pertencem a escopos explícitos.

Quando definimos uma variável com "my", ela existe apenas dentro do 
bloco sintático que contém o escopo onde ela está definida:

foreach my $item ( @compras ){
   # $item existe aqui dentro...
}
# ... mas não existe aqui fora.

Isso encerra a compreensão de escopo e my.

Agora vamos tentar explicar a diferença de "my" e "local". São muito 
parecidas, mas tem uma diferença sutil. "my" 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.

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

Por exemplo:

#!/usr/bin/perl
use strict;
use warnings;
our $valor;
{
   local $valor = 10;
   {
     local $valor = 20;
     print qq{Valor: $valor\n};  # 20
   }
   print qq{Valor: $valor\n}; # 10
}

Aqui, temos um exemplo de uso de "local" e "our" bem educativo.
Se você substituir "our" por "local", o Perl vai reclamar que não existe 
declaração da variável "$valor":

#!/usr/bin/perl
use strict;
use warnings;
local $valor;
{
   local $valor = 10;
   {
     local $valor = 20;
     print qq{Valor: $valor\n};  # 20
   }
   print qq{Valor: $valor\n}; # 10
}

termina com montes de erros "Global symbol '$valor' requires explicit 
package name at..."

O que "our" faz é declarar uma variável mais ou menos como "my", 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.

Agora, eu acho que você já sabe o bastante para começar a brincar.
Por favor não se acanhe e pergunte qualquer coisa que você não 
compreendeu até agora.
Lembre-se: isso não é toda a informação, é apenas uma introdução rápida 
para o mecanismo... :)

Putamplexos!
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


Mais detalhes sobre a lista de discussão Cascavel-pm