[Cascavel-pm] Mais uma pergunta idiota de REGEX !!!

Luis Campos de Carvalho monsieur_champs em yahoo.com.br
Terça Junho 29 07:57:00 CDT 2004


Solli Moreria Honorio wrote:
[Patrocínio O'Malleys]
> Pelos menos poderemos ser conhecido como bons de copo :-)

   Não sei se posso dizer que isso é uma vantagem...

> A minha dúvida é quando eu uso o '^' e o '$' entre o valor desejado, na
> minha leitura isto siginfica exatamente o valor, e ai qual seria a
> vantagem de utilizar expressões regulares.

   O caracter '^' (quando usado fora de grupos de caracteres '[...]') 
funciona como uma "âncora" para o início da linha. Ele permite que a 
expressão regular tenha sucesso apenas quando não houver caracteres à 
esquerda do '^'. Isto pode ser alterado levemente com a opção '/m'.

   O caracter '$' (quando for o caracter mais à direita da expressão 
regular) funciona como "âncora" para o final da linha. Ele permite que a 
expressão regular tenha sucesso apenas quando não houver caracteres à 
direita do '$'. Isto pode ser alterado levemente com a opção '/m'.

   Exemplo:

   /^Fred/ bate com "Fred Flintstone". Mas /Fred$/ não bate.

   /^Vilma Flintstone$/ bate com "Vilma Flintstone", mas não bate com 
"Fred e Vilma Flintstone" (você pode me dizer por quê?).

> Utilizando o seu exemplo, eu concluo que a minha leitura está correta
> (coisa rara hein !!), mas mesmos assim não consiguo compreender porque o
> cara utiliza expressão regular para isto, você mesmo disse em um email
> passado sobre as melhores prática em Perl para não utilizar expressões
> regulares sem necessidades.

   Várias:
   A) O fato de ser considerado "boa prática" não implica que todos os 
autores de módulos fazem isto.
   B) Expressões regulares podem ter muitos efeitos colaterais. Pode ser 
que suas expressões tenham efeitos colaterais desejáveis.

   Bom, até aqui aprendemos que podemos ter expressões regulares que 
batem com uma parte da expressão procurada, e conseqüêntemente se 
comportam de forma diferente da igualdade simples.

   Aprendemos também que uma expressão regular "custa mais caro" (em 
ciclos de processador) do que uma comparação caracter-a-caracter ou que 
uma comparação numérica.

   Aprendemos ainda como usar âncoras em expressões regulares para 
controlar *onde* a expressão pode ser encontrada (começo ou final da 
linha).

> Estou perguntando isto porque tenho visto este tipo de expressão em
> muitos códigos de sistemas 'famosos' em Perl, como o 'SpamAssassin' e
> alguns outros no qual estou trabalhando. Isto pode significar um mau uso
> da lingaguem ?

   No caso do SpamAssassin, eu gostaria de olhar com mais calma. Não 
descarto a possibilidade, mas acredito que isto seja indício de uma 
tentativa de exploração de "efeitos colaterais desejáveis" das 
expressões regulares.

   Claro, estes efeitos sempre tem um preço. Por exemplo, as variáveis 
$`, $& e $' (respectivamente $PREMATCH, $MATCH e $POSTMATCH, se você 
disser "use English;") são sempre[1] inicializadas depois que uma 
expressão regular consegue encontrar o que procura: $PREMATCH recebe 
tudo o que anteceder a expressão regular encontrada, $MATCH recebe o 
valor encontrado pela expressão regular e $POSTMATCH recebe tudo o que 
preceder o valor encontrado pela expressão regular.

   ATENÇÃO: ISTO CUSTA MUITO CARO PARA A MÁQUINA DE EXPRESSÕES REGULARES 
DO PERL. NÃO USE A NÃO SER QUE VOCÊ TENHA CERTEZA ABSOLUTA QUE ESTA É A 
ÚNICA MANEIRA DE FAZER ISTO E PELO MENOS DUAS LISTAS DE DISCUSSÃO DE 
PERL MONKS NÃO TENHAM CONSEGUIDO PROPOR OUTRA SOLUÇÃO.

> Ainda não... mas estou ancioso para isto !!!
> 

   Solli, se isto não ajudar, vamos ser mais práticos: me envie o código 
em que você empacou, e eu ajudo a "destrinchar". Depois, se você quiser, 
podemos continuar conversando sobre expressões regulares...

   Putamplexos!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
   Luis Campos de Carvalho is BSc in Comp Science,
   PerlMonk [SiteDocClan], Cascavel-pm Moderator,
   Unix Sys Admin && Certified Oracle DBA
   http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[1] Isto é mentira, mas "O que você não pode ver não pode atingir você" 
(Larry Wall).




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