[Rio-pm] Comparação de arquivos

Nicole Scherer bionica2007-perl em yahoo.com
Segunda Novembro 26 07:25:26 PST 2012


Obrigada, Stanislaw e Tiago,

lembro de ter visto isso na palestra do brian d foy no YAPC do ano passado, mas nunca tinha usado.
Vou estudar esses artigos.

Obrigada!
Nicole




________________________________
 De: Stanislaw Pusep <creaktive em gmail.com>
Para: Nicole <bionica2007-perl em yahoo.com>; Perl Mongers Rio de Janeiro <rio-pm em pm.org> 
Enviadas: Segunda-feira, 26 de Novembro de 2012 11:01
Assunto: Re: [Rio-pm] Comparação de arquivos
 

Esta sintaxe de expressão regular é chamada de "named capture". Surgiu no Perl v5.10. Ao invés de $1, $2, $3, ..., você dá um nome legível à captura.
Por si só, já é bastante útil, mas a utilidade maior aparece na possibilidade da construção de "grammars", similares a BNF (https://pt.wikipedia.org/wiki/Formalismo_de_Backus-Naur#Exemplo).
Recomendo esse artigo para aprender a usar estes recursos: http://www.effectiveperlprogramming.com/blog/1479

ABS()




2012/11/26 Nicole <bionica2007-perl em yahoo.com>

Oi a todos,
>
>aproveitando a paciência infinita do Breno...
>
>
>Poderias esclarecer como funciona isto:
>(?<tag>...) 
>
>
>e o que acontece então aqui:
>
>"valores agrupados na regex por nome dentro do hash %+. No caso,
>acessei o grupo (?<mirna>....) fazendo $+{mirna};"
>
>
>Criaste um hash de nome %+ ???? 
>
>É uma variável reservada?
>Qual o valor que assume $mirna aqui?
>Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key do hash %dados assim?
>
>
>[]'s
>Nicole Scherer
>
>
>
>
>
>
>________________________________
> De: breno <breno em rio.pm.org>
>Para: Perl Mongers Rio de Janeiro <rio-pm em pm.org> 
>Enviadas: Sábado, 24 de Novembro de 2012 9:45
>Assunto: Re: [Rio-pm] Comparação de arquivos
> 
>
>2012/11/24 Aureliano Guedes <guedes_1000 em hotmail.com>:
>>
>> Se não for ser muito chato, como faço para seguir a forma abaixo:
>>
>>
>>> 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
>>> modificar $/) e ir acumulando as linhas até encontrar um símbolo que
>>> indique nova entrada.
>>
>> seria algo do tipo:
>>
>> while (<$fh>){
>> if(/primeira linha/){
>> print $_;
>> }
>> elsif (/ultima linha/){
>> #sair do loop
>> }
>> else {
>> print $_
>> }
>> }
>>
>
>Algo como (atenção, código não testado):
>
>---------------8<---------------
>my %dados = ();
>my $mirna;
>my $acumulador;
>
>while (my $linha = <$fh>) {
>   if ( $linha =~ m{tag
 magica (?<mirna>\S+)} ) {
>      $dados{$mirna} = $acumulador if $mirna;
>      $mirna = $+{mirna};
>      $acumulador = q();
>   }
>   else {
>      $acumulador .= $linha;
>   }
>}
>
>use DDP; p %dados;
>
>--------------->8---------------
>
>O que isso faz (ou deveria fazer: já mencionei que não testei?
>Programar a essa hora da manhã não é meu forte, então favor
>desconsiderar qualquer besteira):
>
>1) le o arquivo linha por linha, atribuindo o valor de cada linha a
>$linha (sem usar $_)
>2) sempre que encontrar a tag mágica que separa entradas (estou
>assumindo que a tag indica um novo registro que pode ser chave do seu
>hash de dados:
>2.1) se já estiver com um registro em memória ($mirna), bota os dados
>acumulados ($acumulador) dentro do hash;
>2.2) atribui à $mirna o novo registro encontrado. Note que
 estou
>usando grupos nomeados na regex, fazendo (?<tag>...) em vez de apenas
>(...). Isso funciona a partir do 5.10.0 e me permite acessar os
>valores agrupados na regex por nome dentro do hash %+. No caso,
>acessei o grupo (?<mirna>....) fazendo $+{mirna};
>2.2) zera o acumulador.
>3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
>desse 'else' vc pode fazer coisas como "next if $linha =~ /.../" caso
>não queira guardar alguma linha, por exemplo.
>4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.
>
>
>Entendeu?
>
>[]s
>
>-b
>_______________________________________________
>Rio-pm mailing list
>Rio-pm em pm.org
>http://mail.pm.org/mailman/listinfo/rio-pm
>
>
>
>_______________________________________________
>Rio-pm mailing list
>Rio-pm em pm.org
>http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121126/a3e96d0a/attachment-0001.html>


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