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