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-p...@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 <br...@rio.pm.org>
> *Para:* Perl Mongers Rio de Janeiro <rio-pm@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_1...@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@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Responder a