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

Agustinho Coelho agustinho_coelho em yahoo.com.br
Terça Julho 29 05:18:18 PDT 2008


Nelson Ferraz wrote:
> 2008/7/28 Agustinho Coelho <agustinho_coelho em yahoo.com.br>:
>   
>> Boa Tarde a todos,
>>
>> Seguindo orientações  do pessoal da lista eu comecei a declarar o uso de
>> *strict *e *warnings *no início dos programas.
>>     
>
> Todos nós ficamos muito felizes com isso!
>
> Experimente colocar um use diagnostics para obter ainda mais
> informações sobre as mensagens de erro.
>
> Com relação ao seu problema, em particular, parece que você esqueceu
> de um ponto-e-vírgula de pois do print "Digite: ".
>
>   
>> OBS: Eu sei que é uma dúvida bem básica mas não consegui compreender muito
>> bem e gostaria que isso não comprometesse os programas.
>>     
>
> Você fez muito bem em colocar use strict e use warnings em seu
> programa. Eles vão te ajudar a programar melhor.
>
> Veja também a ferramenta perlcritic, que vem com o módulo Perl::Critic.
>
> []s
>
> Nelson
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com 
> Version: 8.0.138 / Virus Database: 270.5.6/1577 - Release Date: 7/28/2008 6:55 AM
>
>
>
>   
/Realmente eu esqueci a vírgula... Desculpas.../
> 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!
Luís,

Valeu mesmo pela explicação!!!

Abs,

Agustinho.




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