[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