[Cascavel-pm] Inversao de variavel

Luis Campos de Carvalho lechamps em terra.com.br
Terça Setembro 23 13:54:11 CDT 2003


Alceu R. de Freitas Jr. wrote:
>  --- Luis Campos de Carvalho <lechamps em terra.com.br>
> escreveu:
> 
>>   # Bico!
>>   sub reverse_octets{
>>     my $ip = shift || '127.0.0.1';
>>     return
>>       $ip =~
>>m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ ?
>>         "$4.$3.$2.$1" : undef;
>>   }
>>
>>   # para usar:
>>   print reverse_octets '200.10.5.1';
>>
>>   Se você se interessar como funciona, o Alceu
>>explica! =-]
> 
> 
> "$4.$3.$2.$1" : undef;
> 
> Para ser sincero, não entendi a função dos ":" na
> linha acima. Eu lembro vagamente que Perl tem uma
> estrutura que emula um if-then-else, mas eu nunca
> usei... seria isso?
> 

   =-]
   Desculpe. Eu virei o fogo para o seu lado, e nem sabia se você estava 
com as batatas prontas para assar... eheheh....

   Quanto à sintaxe maluca, vamos entender, então.


   Se você algum dia usou C, deve ter cruzado com o operador ternário 
(de três caracteres) que C usa para emular um if-then-else "inline", 
isso é, em uma única expressão que retorna um 'rvalue', um valor que 
pode ser atribuído a expressões do tipo 'lvalue' (variáveis e outros 
"quitutes").

   O operador é o

     <boolean>? <expr1> : <expr2>;

   note os sinais de pontuação. O funcionamento é simples: se <boolean> 
é uma expressão que resolve para "true", o operador ?: retorna <expr1>. 
Caso <boolean> resolva para "false", o operador ?: retorna <expr2>.

   De volta no casinho da inversão de octetos:

return
   $ip =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ ?
     "$4.$3.$2.$1" :
     undef;

   Repare no operador ?:, em torno desta baderna.
   O que temos, na verdade, é um pattern match (que retorna a quantidade 
de matches conseguidos, em contexto escalar), usado como <boolean> do 
operador '?:'. Para completar, temos

   <expr1> == "$4.$3.$2.$1"
   <expr2> == undef

   Assim, a instrução pergunta: "Isto parece com um endereço IP?"
   E, se a resposta for "sim", retorna o valor invertido "$4.$3.$2.$1".
   Caso a resposta seja "não", retorna undef, para indicar erro.

   Espero que esteja claro agora.
   Será que o Leandro conseguiu usar essa coisa?
   []'z!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
   Luis Campos de Carvalho is Computer Scientist,
   PerlMonk [SiteDocClan], Cascavel-pm Moderator,
   Unix Sys Admin && Certified Oracle DBA
   http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=




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