[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