[SP-pm] Ajuda com Regex

Wagner Klein wagner.klein at gmail.com
Fri Mar 25 17:27:13 PDT 2011


Flavio,

Nesse tipo de processamento eu normalmente faço uma "maquina de
estados".  A forma varia dependendo do que de deseja.

Para o exemplo, uma forma seria:

$stat = 0;
$str = "";

LINE:
  while(<>) {

    $stat == 0 && /^\d+-\S+ id \d+: Start/ && do {
        &processa if $stat;
        $stat = 1;
        $str = $_;
        next LINE;
    };

    next if not $stat;

    $str .= $_;

    $stat == 1 && /^\d+-\S+ id \d+: End/ && do {
        &processa;
        $stat = 0;
        $str = "";
        next LINE;
    };

 }

&processa if $stat;

sub processa {
    # processa $str que contem o bloco de dados isolados
}


Normalmente não uso o a forma de "coleta e processamento" como acima,
apenas uso a variavel $stat para ir alterando o conhecimento da
informação que estou tratando, por exemplo, se para voce o que deseja
é encontrar o "Termination: OK":

    ....

    $stat == 1 && /\s*Termination: OK/ && do {
        # alguma coisa
        next LINE;
     };

    $stat == 1 && /\s*Termination: / && do {
        # outra coisa (considerando que $' contem a mensagem de erro
se for o caso)
        next LINE;
     };


2011/3/16 "Flávio R. Lopes" <flavio.lopes em links.inf.br>:
> Boa noite pessoal.
> Postei mais ou menos isto num e-mail anterior, mas não consegui resolver
> ainda.
>
> Como posso fazer para delimitar quais a linhas a serem armazenadas num
> array, supondo o seguinte exemplo:
>
> 12-Mar Id 103: Start ...
> 12-Mar Id 103: BlahBlahBlah...
>   Id:                  103
>   Termination:  OK
> 12-Mar Id 103: BlahBlahBlah...
> 12-Mar Id 103: End...
>
> 13-Mar Id 104: Start ...
> 13-Mar Id 104: BlahBlahBlah...
>   Id:                  104
>   Termination:  OK
> 13-Mar Id 104: BlahBlahBlah...
> 13-Mar Id 104: End...
>
> Supondo que eu queira somente as linhas do processo do dia 12-mar, qual
> regex eu poderia usar para DELIMITAR que as linhas que quero são todas as
> compreendidas entre:
> 12-Mar Id 103: Start ...
> e
> 12-Mar Id 103: End...
>
> Observem que existem duas linhas que não tem como padrão a data no início
> dela.
> É possível fazer tipo de uma "marca" nas linhas que quero pegar e "falar"
> para o Perl: Perl, por favor coloque no meu array da linha-x à linha-y ???
> :)
>
> abraço,
> Flávio


More information about the SaoPaulo-pm mailing list