[Cascavel-pm] Dúvida sobre expressão regular

Luis Campos de Carvalho lechamps em terra.com.br
Quinta Outubro 23 14:03:13 CDT 2003


Solli Moreira Honorio wrote:
> Pessoal,
> 
> Estou estudando o livro 'Real World SQL Server Administration with Perl' 
> do Linchi Shea - ed. Apress (_www.apress.com_ 
> <http://webmail.terra.com.br/xwebmail/cgi-bin/www.apress.com>), onde o 
> autor usa e abusa das expressões regulares para monitorar e adminstrar o 
> MS SQL.
> 
> Bom, pra mim expressões regulares são pra lá de abstratas em alguns 
> casos, parecendo até mesmo uma outra linguaguem, e dentre estas 
> encontrei uma expressão no livro que eu não entendi nadinha o que ela 
> está fazendo e por isto eu gostaria de pedir ajuda aos monges.
> 
> O cara vai ler um arquivo com dados parecidos como "Index 
> Scan(OBJECT:([pubs].[dbo].[jobs].[jobs_ix])" e aí o código faz a 
> manipulação maluca abaixo.
> 
> if (m{^[\s | \d | \|]*\|\-\-
> 
> ( Clustered\s+Index\s+Seek | Clustered\s+Index\s+Scan |
> 
> Clustered\s+Index\s+Delete | Clustered\s+Index\s+Update |
> 
> Clustered\s+Index\s+Insert | Index\s+Seek | Index\s+Scan |
> 
> Index\s+Delete | Index\s+Update | Index\s+Insert | Table\s+Scan
> 
> )
> 
> \(OBJECT\:\(
> 
> (
> 
> (\[([^\]] | \]\])+\]) # database name
> 
> \.\[([^\]] | \]\])+\] # owner
> 
> \.\[([^\]] | \]\])+\] # object
> 
> (\.\[([^\]] | \]\])+\])? # index
> 
> )
> 
> \)
> 
> }ix)
> 
> A primeira coisa que eu não entendi é o 'm{}ix', que raio é isto ? É um 
> match ? e depois o resto .... também fiquei boiando.
> 

   Oi, Solli.

   Desculpe a demora... eu estou um pouco sobrecarregado.

   Sim, "m{...}xi" é um match, e um bem complicado. =-]

   Eu vou tentar reescrever o match sem usar a opção "/x", talvez fique 
mais simples de você entender:

m{^[\s|\d|\|]*\|\-\-(Clustered\s+Index\s+Seek|Clustered\s+Index\s+Scan|Clustered\s+Index\s+Delete|Clustered\s+Index\s+Update|Clustered\s+Index\s+Insert|Index\s+Seek|Index\s+Scan|Index\s+Delete|Index\s+Update|Index\s+Insert|Table\s+Scan)\(OBJECT\:\(((\[([^\]]|\]\])+\])\.\[([^\]]|\]\])+\]\.\[([^\]]|\]\])+\](\.\[([^\]]|\]\])+\])?)\)}i

   Como você pode notar, este é um Match BEM comprido.

   A opção "/x" serve para 'eXtender' as expressões regulares para que 
ela aceite e ignore espaços em branco não-quotados e comentários no 
estilo do perl (de "#" até o final da linha). Isso permite que a 
expressão regular fique mais legível e conseqüêntemente mais simples de 
manter.

   Agora, quanto às chaves ("{" e "}"), que delimitam a expressão:

   Uma expressão regular pode ser delimitada por "/", ou por qualquer 
outro caracter que você deseje, desde que você indique claramente ao 
Perl que o que segue é uma expressão regular, usando para isso o 
operador "m" (de "match").

   Assim, escrever

   $thing =~ /thing/;

   ou

   $thing =~ m,thing,;

   ou

   $thing =~ m;thing;;

   é exatamente a mesma coisa...

   Espero que isso ajude você a entender a sua expressão...
   []'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