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

Solli Honorio shonorio em gmail.com
Segunda Julho 28 21:20:46 PDT 2008


Caramba até eu entendi agora a história do escopo, e nem precisou desenhar
;-) !

Solli M. Honório

2008/7/28 Luis Motta Campos <luismottacampos em yahoo.co.uk>

> 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.
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20080729/2e20aa1a/attachment.html>


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