[Rio-pm] Comparação de arquivos

Tiago Peczenyj tiago.peczenyj em gmail.com
Segunda Novembro 26 04:48:02 PST 2012


a partir de alguma versão recente (5.12 ?) introduziu os named groups. Vc
acessa atraves do hash %+ que é uma variavel especial "amarrada" a ultima
expressão regular daquele bloco de codigo.

criar variaveis é perigoso. se vc tem algo como

$password

não vai querer isso sobreescrito por

/(?<password>.+)/

por isso vc acessa $+{password} o quanto antes, pois a proxima operação de
match vai resetar a variavel

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
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121126/28b463bc/attachment-0001.html>


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