[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