[Cascavel-pm] Duvida sobre variaveis

Eden Cardim edencardim em gmail.com
Quinta Junho 8 06:57:25 PDT 2006


On 6/8/06, Antonio Carlos I. Paes <lists em xms.com.br> wrote:
> Lista,
>
>         Surgiu outra duvida a respeito de variaveis,
>
> Seguindo o conselho, estou usando strict e warnings, mas ele me gera essas
> mensagens:
> "my" variable $mesg masks earlier declaration in same scope at ./syslog2db.pl
> line 48.
> "my" variable $mesg masks earlier declaration in same scope at ./syslog2db.pl
> line 49.
> Global symbol "$mesg" requires explicit package name at ./syslog2db.pl line
> 57.
> Execution of ./syslog2db.pl aborted due to compilation errors.
>
> O codigo abaixo representa essas linhas:
>   # $mesg
>   if (@mesg) {
>     my $mesg = "@mesg";
>     my $mesg =~ s/\\/\\\\/g;
>     my $mesg = $dsn->quote("$mesg");
>   }
>   else { return; }

Bem, você está re-declarando o escalar $mesg 2 vezes, e não está
declarando o array @mesg, por isso os avisos na compilação. Use o my
na primeira aparição da variável apenas.

> Pergunto: Nao ha uma forma mais facil de se definir tudo isso numa linha so?
Não, mas dá pra fazer em duas:
my($mesg = "@mesg") =~ s/\\/\\\\/g;
$mesg = $dsn->quote("$mesg");

> Como o Perl interpreta esse tipo de situacao, onde a variavel e' substituida
> por ela mesmo.
Como qualquer outra linguagem, o lado direito da expressão de
atribuição é avaliado primeiro na pilha.

> Obs.: Utilizei o "s/\\/\\\\/g" para "escapar" as barras (\), o quote() nao me
> fez isso...
se você tirar as aspas de "$mesg", o perl não vai interpolar as barras
e você não vai precisar as barras e o código final vai ficar assim:

my $mesg = $dsn->quote("@mesg");

bem mais simples né? ;)


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