Re: [Rio-pm] Comparação de arquivos
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
Re: [Rio-pm] Comparação de arquivos
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-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 -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
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-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
Re: [Rio-pm] Comparação de arquivos
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 creakt...@gmail.com Para: Nicole bionica2007-p...@yahoo.com; Perl Mongers Rio de Janeiro rio-pm@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-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
Re: [Rio-pm] Comparação de arquivos
Três coisas são infinitas: o universo, a paciência do Breno e a estupidez humana. Mas, no que respeita ao universo, ainda não adquiri a certeza absoluta. Albert Einstein não conhecia essa variável na época. From: bla...@gmail.com Date: Sat, 24 Nov 2012 22:03:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos Três coisas são infinitas: o universo, a paciência do Breno e a estupidez humana. Mas, no que respeita ao universo, ainda não adquiri a certeza absoluta. 2012/11/24 Ole Peter Smith ole@gmail.com: On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote: Breno, que ser meu orientador... hahaha... se eu era reitor universitario, eu daria o grau de dr honoratis para o este nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de enseminar conhecimentos 0le Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Date: Sat, 24 Nov 2012 09:45:41 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: 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 ___ 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
Re: [Rio-pm] Comparação de arquivos
nem perl. senão ele saberia que o correto é $E = m*c**2 2012/11/25 Aureliano Guedes guedes_1...@hotmail.com Três coisas são infinitas: o universo, a paciência do Breno e a estupidez humana. Mas, no que respeita ao universo, ainda não adquiri a certeza absoluta. Albert Einstein não conhecia essa variável na época. From: bla...@gmail.com Date: Sat, 24 Nov 2012 22:03:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos Três coisas são infinitas: o universo, a paciência do Breno e a estupidez humana. Mas, no que respeita ao universo, ainda não adquiri a certeza absoluta. 2012/11/24 Ole Peter Smith ole@gmail.com: On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote: Breno, que ser meu orientador... hahaha... se eu era reitor universitario, eu daria o grau de dr honoratis para o este nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de enseminar conhecimentos 0le Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Date: Sat, 24 Nov 2012 09:45:41 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: 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 ___ 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 -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Comparação de arquivos
2012/11/24 Aureliano Guedes guedes_1...@hotmail.com: Tem muitas coisas que posso desconsiderar desse perlcritc, ne?! No livro, cada recomendação acompanha uma breve discussão com motivações, edge cases, exemplos e alternativas. O ideal é que vc leia e tire suas próprias conclusões. Depois, pode criar seu próprio arquivo .perlcriticrc apenas com as regras que deseja reforçar. Algumas pessoas criaram suas próprias regras também, e colocaram no CPAN. Procure por Perl::Critic e Perl::Critic::Profile para mais detalhes. Eu gosto bastante do Perl Best Practices. Preste apenas um pouco mais de atenção quando o Damian recomenda um ou outro módulo: o livro é antigo (já tem mais de 7 anos), e muitos módulos deixaram de ser mantidos ou provaram ser mais problemáticos do que benéficos, enquanto outros padrões de-facto surgiram (como Moose). Para uma referência mais atualizada dos módulos citados, veja https://www.socialtext.net/perl5/pbp_module_recommendation_commentary Independente do que escolha, o mais importante é consistência. Se escolher um padrão ou conjunto de regras particulares de desenvolvimento, certifique-se de que elas valem para todo o código :) []s -b ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Comparação de arquivos
Assim vcs me matam de vergonha =P []s -b 2012/11/24 Blabos de Blebe bla...@gmail.com: Três coisas são infinitas: o universo, a paciência do Breno e a estupidez humana. Mas, no que respeita ao universo, ainda não adquiri a certeza absoluta. 2012/11/24 Ole Peter Smith ole@gmail.com: On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote: Breno, que ser meu orientador... hahaha... se eu era reitor universitario, eu daria o grau de dr honoratis para o este nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de enseminar conhecimentos 0le Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Date: Sat, 24 Nov 2012 09:45:41 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: 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 ___ 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
Re: [Rio-pm] Comparação de arquivos
2012/11/25 Tiago Peczenyj tiago.pecze...@gmail.com: nem perl. senão ele saberia que o correto é $E = m*c**2 ou, para cobrir todos os casos, -8- use bignum; use constant c = 299_792_458; my $m = massa(); my $p = momentum(); my $E = sqrt( ($m * c**2)**2 + ($p * c)**2 ); -8- =P []s -b ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Comparação de arquivos
vergonha nada, orgulho, rapaz! 0le Send via Android On Nov 26, 2012 1:53 AM, breno br...@rio.pm.org wrote: Assim vcs me matam de vergonha =P []s -b 2012/11/24 Blabos de Blebe bla...@gmail.com: Três coisas são infinitas: o universo, a paciência do Breno e a estupidez humana. Mas, no que respeita ao universo, ainda não adquiri a certeza absoluta. 2012/11/24 Ole Peter Smith ole@gmail.com: On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote: Breno, que ser meu orientador... hahaha... se eu era reitor universitario, eu daria o grau de dr honoratis para o este nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de enseminar conhecimentos 0le Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Date: Sat, 24 Nov 2012 09:45:41 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: 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 ___ 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
Re: [Rio-pm] Comparação de arquivos
2012/11/24 Aureliano Guedes guedes_1...@hotmail.com: Breno, que ser meu orientador... hahaha... Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Sempre há :) Particularmente, não gosto dessa sua chamada a main() no final do arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o seu código (instruções podem aparecer a qualquer momento fora de uma sub, o figura tem que passar por todo o seu script até saber que vc só está chamando main()). Eu trocaria a ordem, deixando assim: 8 use strict; use warnings; use autodie; main(); exit; # declaracoes de sub aqui embaixo 8 Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao leitor que não haverão surpresas no meio das subs. No mais, experimente usar o Perl::Critic (dá até pra usar online via perlcritic.com) e veja se ele reclama de alguma coisa. []s -b ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Comparação de arquivos
Opa, obrigado então por toda ajuda. No mais, so o log do perlcritc. http://pastebin.com/esYuR04J tenso, ne?! Date: Sat, 24 Nov 2012 18:01:13 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com: Breno, que ser meu orientador... hahaha... Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Sempre há :) Particularmente, não gosto dessa sua chamada a main() no final do arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o seu código (instruções podem aparecer a qualquer momento fora de uma sub, o figura tem que passar por todo o seu script até saber que vc só está chamando main()). Eu trocaria a ordem, deixando assim: 8 use strict; use warnings; use autodie; main(); exit; # declaracoes de sub aqui embaixo 8 Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao leitor que não haverão surpresas no meio das subs. No mais, experimente usar o Perl::Critic (dá até pra usar online via perlcritic.com) e veja se ele reclama de alguma coisa. []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
Re: [Rio-pm] Comparação de arquivos
Tem muitas coisas que posso desconsiderar desse perlcritc, ne?! agora em Regular expression without /x flag at line 49, column 18. See page 236 of PBP. Severity: 3 fiquei sem entender, pra que esse maldito /x, não me parece que va mudar muita coisa. Mas legal, se jogar no nivel parece ajudar muito... vou ler o PBP Hard tabs used at line 15, column 12. See page 20 of PBP. Severity: 3 Hard tabs used at line 17, column 17. See page 20 of PBP. Severity: 3 Close filehandles as soon as possible after opening them at line 18, column 2. See page 209 of PBP. Severity: 4 Ambiguously named variable record at line 20, column 2. See page 48 of PBP. Severity: 3 Regular expression without /x flag at line 23, column 18. See page 236 of PBP. Severity: 3 Regular expression without /x flag at line 29, column 20. See page 236 of PBP. Severity: 3 Hard tabs used at line 41, column 13. See page 20 of PBP. Severity: 3 Hard tabs used at line 43, column 17. See page 20 of PBP. Severity: 3 Close filehandles as soon as possible after opening them at line 44, column 2. See page 209 of PBP. Severity: 4 Ambiguously named variable record at line 46, column 2. See page 48 of PBP. Severity: 3 Regular expression without /x flag at line 49, column 18. See page 236 of PBP. Severity: 3 Regular expression without /x flag at line 56, column 25. See page 236 of PBP. Severity: 3 Hard tabs used at line 58, column 4. See page 20 of PBP. Severity: 3 From: tiago.pecze...@gmail.com Date: Sat, 24 Nov 2012 18:15:36 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos use o nivel 3 (mediano) 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com Opa, obrigado então por toda ajuda. No mais, so o log do perlcritc. http://pastebin.com/esYuR04J tenso, ne?! Date: Sat, 24 Nov 2012 18:01:13 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com: Breno, que ser meu orientador... hahaha... Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Sempre há :) Particularmente, não gosto dessa sua chamada a main() no final do arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o seu código (instruções podem aparecer a qualquer momento fora de uma sub, o figura tem que passar por todo o seu script até saber que vc só está chamando main()). Eu trocaria a ordem, deixando assim: 8 use strict; use warnings; use autodie; main(); exit; # declaracoes de sub aqui embaixo 8 Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao leitor que não haverão surpresas no meio das subs. No mais, experimente usar o Perl::Critic (dá até pra usar online via perlcritic.com) e veja se ele reclama de alguma coisa. []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 -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ 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
Re: [Rio-pm] Comparação de arquivos
ordene por severidade e se guie. se não me engano vc tem uns 9 nivels de verbosidade do perlcritic e no mais avantajado (la ele) tem até exemplos. vale a pena. 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com Tem muitas coisas que posso desconsiderar desse perlcritc, ne?! agora em Regular expression without /x flag at line 49, column 18. http://perlcritic.com/tmp/ovXTXZfUGR.html#49 See page 236 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.html fiquei sem entender, pra que esse maldito /x, não me parece que va mudar muita coisa. Mas legal, se jogar no nivel parece ajudar muito... vou ler o PBP Hard tabs used at line 15, column 12. http://perlcritic.com/tmp/ovXTXZfUGR.html#15 See page 20 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlHard tabs used at line 17, column 17. http://perlcritic.com/tmp/ovXTXZfUGR.html#17 See page 20 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlClose filehandles as soon as possible after opening them at line 18, column 2. http://perlcritic.com/tmp/ovXTXZfUGR.html#18 See page 209 of PBP. Severity: 4 http://perlcritic.com/pod/Perl/Critic/Policy/InputOutput/RequireBriefOpen.htmlAmbiguously named variable record at line 20, column 2. http://perlcritic.com/tmp/ovXTXZfUGR.html#20 See page 48 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/NamingConventions/ProhibitAmbiguousNames.htmlRegular expression without /x flag at line 23, column 18. http://perlcritic.com/tmp/ovXTXZfUGR.html#23 See page 236 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlRegular expression without /x flag at line 29, column 20. http://perlcritic.com/tmp/ovXTXZfUGR.html#29 See page 236 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlHard tabs used at line 41, column 13. http://perlcritic.com/tmp/ovXTXZfUGR.html#41 See page 20 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlHard tabs used at line 43, column 17. http://perlcritic.com/tmp/ovXTXZfUGR.html#43 See page 20 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlClose filehandles as soon as possible after opening them at line 44, column 2. http://perlcritic.com/tmp/ovXTXZfUGR.html#44 See page 209 of PBP. Severity: 4 http://perlcritic.com/pod/Perl/Critic/Policy/InputOutput/RequireBriefOpen.htmlAmbiguously named variable record at line 46, column 2. http://perlcritic.com/tmp/ovXTXZfUGR.html#46 See page 48 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/NamingConventions/ProhibitAmbiguousNames.htmlRegular expression without /x flag at line 49, column 18. http://perlcritic.com/tmp/ovXTXZfUGR.html#49 See page 236 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlRegular expression without /x flag at line 56, column 25. http://perlcritic.com/tmp/ovXTXZfUGR.html#56 See page 236 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlHard tabs used at line 58, column 4. http://perlcritic.com/tmp/ovXTXZfUGR.html#58 See page 20 of PBP. Severity: 3 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.html -- From: tiago.pecze...@gmail.com Date: Sat, 24 Nov 2012 18:15:36 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos use o nivel 3 (mediano) 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com Opa, obrigado então por toda ajuda. No mais, so o log do perlcritc. http://pastebin.com/esYuR04J tenso, ne?! Date: Sat, 24 Nov 2012 18:01:13 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com: Breno, que ser meu orientador... hahaha... Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Sempre há :) Particularmente, não gosto dessa sua chamada a main() no final do arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o seu código (instruções podem aparecer a qualquer momento fora de uma sub, o figura tem que passar por todo o seu script até saber que vc só está chamando main()). Eu trocaria a ordem, deixando assim: 8 use strict; use warnings; use autodie; main(); exit; # declaracoes de sub aqui embaixo 8 Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao leitor que não haverão surpresas no meio das subs
Re: [Rio-pm] Comparação de arquivos
On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote: Breno, que ser meu orientador... hahaha... se eu era reitor universitario, eu daria o grau de dr honoratis para o este nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de enseminar conhecimentos 0le Enfim, ficou assim http://pastebin.com/zrpLGwQs Ha algo que você mudaria??? Date: Sat, 24 Nov 2012 09:45:41 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: 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
Re: [Rio-pm] Comparação de arquivos
Breno, valeu mesmo por mais dicas preciosas, dessa ultima forma que me falou foi bem mais facil codar. A logica foi super-simples mas não fui capaz de pensar nisso sozinho. Mais ainda estou com um problema e uma duvida. - devido o $/ o print não esta saindo completo, vem faltando parte do documento, justamente o valor de $/. Como resolver isso? - Não entendo o que você quer dizer com testar o valor de retorno de funções como open()? Em fim segue o codigo: http://pastebin.com/KH2bAGWU Desconcidere o seu modulo Data::Printer, usei ele para testar o hash e esqueci de tirar do codigo depois, XD. (Otimo modulo). Date: Fri, 23 Nov 2012 01:30:35 -0200 From: br...@rio.pm.org To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos 2012/11/22 Aureliano Guedes guedes_1...@hotmail.com: Opa, obrigado pela ajuda e pelas preciosas dicas. - Não achei uma função no List::MoreUtils que fizesse o mesmo que o dups do Array::Uniq, tem alguma função no List::MoreUtils que crie um terceiro array apenas com itens que outros dois ou mais arrays tem em igual? Tem razão, Aureliano. A função dup() do List::MoreUtils remove duplicatas, não as retorna para você. Se o Array::Uniq te atende então, maravilha. Se preferir resolver direto no Perl, seguem algumas alternativas (só por desencargo mesmo): my %duplicadas = (); my %visitadas = (); foreach (@a, @b) { $visitadas{$_}++ $duplicadas{$_}++; } my @resultado = sort keys %duplicadas; my @resultado = (); foreach my $item (sort @b) { push @resultado, $item if any { $item eq $_ } @a; } my %visitadas = (); my @resultado = sort grep { $visitadas{$_}++ == 1 } @a, @b; - Particularmente não vi vantagem em usar o Path::Class, para meu caso qual seria a vantagem? O Path::Class resolve um monte de coisas pra vc. Hoje você abre arquivos no mesmo diretório. Se amanhã quiser usar diretórios diferentes, cada sistema tem um separador diferente ('/', '\', etc). O Path::Class faz isso pra vc. Outro motivo é a preguiça. Escrever: my $fh = file( $nome_do_arquivo )-openr; é a mesma coisa que escrever: open my $fh, '', $nome_do_arquivo or Carp::croak error opening file $nome_do_arquivo: $!\n; Se vc só vai fazer isso, tudo bem. Mas quando começa a ter que passear e manipular arquivos e diretórios, acredite: faz toda a diferença :) Independente do que escolher, lembre-se sempre de testar o valor de retorno de funções como open(), bem como usar open() sempre com 3 argumentos! - Quanto a criar um modulo fazendo o que as subs fazem, depois vou pensar nessa hipotese, mais um modulo para o BioPerl não faz mal. Maravilha! - Quanto ao que você falou no item 11: - Continuei usando barewords pois não deu certo usando strings, por algum motivo que não sei por que? (Afinal qual o problema das barewords?) Não diga não deu certo, nos diga o erro! Barewords são problemáticas por diversos motivos, o principal deles é que são globais. Lembra dos bugs de ação à distância? Pois é, se vc usar sem querer o mesmo nome de file handle (digamos, FH, FILE, ARQ ou equivalente) em diferentes lugares, seu programa vai se comportar de maneira estranha e vc não vai ter idéia do motivo. Por mais que você ache que seu programa é pequeno e controlável agora, é o tipo de boa prática que compensa *muito* a medida que o programa escala (ou o tempo passa e vc tem q manter o código 6 meses depois). Variáveis podem ser utilizadas como filehandle desde o Perl 5.6.0, de 12 anos atrás. Desde então, esse tem sido o meio recomendado para lidar com arquivos - a menos que vc esteja fazendo um oneliner rápido na linha de comando, ou lidando com handles nativos como STDIN, STDOUT, DATA, etc. 11) No seu código você abre os arquivos 'hybrid.txt' e 'miranda.txt' duas vezes para leitura. Isso normalmente significa que você poderia ter colocado tudo numa estrutura de fácil acesso e manipulação, e lido o arquivo apenas uma vez (operações de E/S costumam ser bem mais pesadas do que manipulação em memória). Dica: sempre que tiver mais de um while() ou foreach() varrendo a mesma estrutura para ler dados, é bem possível que você possa otimizar e deixar mais claro seu algoritmo fazendo a varredura apenas uma vez. Isso me preocupou, veja bem, não consegui pensar em uma forma de varrer o arquivo fazendo o que preciso apenas em um laço. parsin_h e parsin_m extraem um valor que são gravados em array, @inh e @inm respectivamente, depois um terceiro array (@in) é criado apenas com os valores que @inh e @inm tem em comum. Os valores de @in são a referencia de o que eu quero extrair dos arquivos hybrid.txt e miranda.txt. Você pode por exemplo passar uma vez só em cada arquivo e armazenar os elementos como pares chave-valor, por exemplo: my %miranda = ( 'hsa-miR-15a' = '...', 'hsa-miR-16' = '...', ... ); my %hybrid
Re: [Rio-pm] Comparação de arquivos
2012/11/23 Aureliano Guedes guedes_1...@hotmail.com: Breno, valeu mesmo por mais dicas preciosas, dessa ultima forma que me falou foi bem mais facil codar. A logica foi super-simples mas não fui capaz de pensar nisso sozinho. Mais ainda estou com um problema e uma duvida. - devido o $/ o print não esta saindo completo, vem faltando parte do documento, justamente o valor de $/. Como resolver isso? Várias formas diferentes. Seguem duas de exemplo: 1) concatenar $/ ao final da sua string na hora de atribuir; 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. Eu prefiro essa abordagem pq facilita (pra mim) a compreensão e ajuda (para todos) a alteração/extensão futura do seu parser, caso vc queira em algum momento separar os valores de cada registro em subgrupos, por exemplo. Note ainda que, se for possivel interagir com os dados dos programas internos mais diretamente (por exemplo, através de wrappers de alguma API) em vez de analisando essa saída, você provavelmente conseguirá mais flexibilidade na leitura e interpretação dos dados de saida. - Não entendo o que você quer dizer com testar o valor de retorno de funções como open()? Funções que acessam o sistema de arquivos tem uma propensão muito maior em falhar, por motivos como muitos arquivos abertos, erro de disco, arquivo não encontrado, só pra citar alguns. Digamos, por exemplo, que você faça: open my $fh, '', 'miranda.txt'; while (my $linha = $fh) { print $linha; } close $fh; E se vc rodar o programa de um diretório errado e, por isso, ele não achar o 'miranda.txt'? Você não vai receber nenhuma resposta (porque está ignorando o valor de retorno da open()), seu programa vai continuar rodando como se nada tivesse acontecido, e operações com o handle vão falhar silenciosamente. Por isso escrevemos: open my $fh, '', 'miranda.txt' or die $!; o or die testa o valor de retorno da função open(). Se open() falhou ao abrir o arquivo, ela retorna undef e registra o erro na variável especial $!. O que o or die está fazendo é: rode o open() ou, se o open() falhar, morra exibindo a mensagem em $!. Entendeu? A maioria das pessoas bota o or die pelo menos depois de um open(), mas a verdade é que várias outras funções podem falhar sem vc ficar sabendo. Por isso o ideal é vc testar o valor de retorno de todas as funções, em especial as que envolvem I/O. Mas convenhamos, isso é chatíssimo. Já pensou fazer print $fh q{lalala} or die 'erro escrevendo em arquivo' cada vez que for fazer um print? Quando vc usa o pragma autodie, ele muda essas funções para que elas gerem excessões fatais caso falhem, de modo que tudo que vc precisa fazer é escrever: use autodie; no início do seu programa e não se preocupar mais. A partir daí, não precisa botar or die nenhum. Sempre que a função falhar (seja open(), close(), print() e várias outras) ela vai gerar uma exceção fatal imediatamente, exibindo qual foi o erro encontrado e em qual linha. Isso ajuda muito a identificar casos extremos e evita que o seu programa continue a execução em um estado inconsistente. Como dizem os Klingons: bIlujDI' yIchegh()Qo'; yIHegh()! (it is better to die() than to return() in failure) Mais detalhes sobre o problema e sobre o autodie = http://perltraining.com.au/tips/2008-08-20.html Em fim segue o codigo: http://pastebin.com/KH2bAGWU Eu faria ainda uma mudança imediata: remover as globais. Em vez de ter : my %h = (); my %m = (); lá em cima, é melhor fazer, dentro da sua main: my %h = hybrid(); my %m = miranda(); Isso compartimentaliza e isola as suas variáveis, que agora só estarão definidas no bloco que de fato as utiliza. Se o seu programa crescer, vc não vai precisar se preocupar com globais acumulando e facilitando problemas de ação à distância. Desconcidere o seu modulo Data::Printer, usei ele para testar o hash e esqueci de tirar do codigo depois, XD. (Otimo modulo). Que bom que gostou =) []s -b ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Comparação de arquivos
Opa, obrigado pela ajuda e pelas preciosas dicas. - Não achei uma função no List::MoreUtils que fizesse o mesmo que o dups do Array::Uniq, tem alguma função no List::MoreUtils que crie um terceiro array apenas com itens que outros dois ou mais arrays tem em igual? - Particularmente não vi vantagem em usar o Path::Class, para meu caso qual seria a vantagem? - Quanto a criar um modulo fazendo o que as subs fazem, depois vou pensar nessa hipotese, mais um modulo para o BioPerl não faz mal. - Quanto ao que você falou no item 11: - Continuei usando barewords pois não deu certo usando strings, por algum motivo que não sei por que? (Afinal qual o problema das barewords?) 11) No seu código você abre os arquivos 'hybrid.txt' e 'miranda.txt' duas vezes para leitura. Isso normalmente significa que você poderia ter colocado tudo numa estrutura de fácil acesso e manipulação, e lido o arquivo apenas uma vez (operações de E/S costumam ser bem mais pesadas do que manipulação em memória). Dica: sempre que tiver mais de um while() ou foreach() varrendo a mesma estrutura para ler dados, é bem possível que você possa otimizar e deixar mais claro seu algoritmo fazendo a varredura apenas uma vez. Isso me preocupou, veja bem, não consegui pensar em uma forma de varrer o arquivo fazendo o que preciso apenas em um laço. parsin_h e parsin_m extraem um valor que são gravados em array, @inh e @inm respectivamente, depois um terceiro array (@in) é criado apenas com os valores que @inh e @inm tem em comum. Os valores de @in são a referencia de o que eu quero extrair dos arquivos hybrid.txt e miranda.txt. Realmente o excesso de operações I/O pesam mas infelizmente não estou conseguindo fugir disso, e desempenho na bioinformatica é importante. Pesso ajuda para solucionar esse mistério tambem. Outro problema é que o output esta feio e ainda o $/ esta sendo omitido. link do script com as devidas alterações - http://pastebin.com/DNuiLUHG link do miranda.txt -http://pastebin.com/qiYavtUe link do hybrid.txt - http://pastebin.com/9v6WFUT7 Agora para exclarecer os arquivos: Miranda pode ter dois formatos: Read Sequence:hsa-miR-4448 MIMAT0018967 Homo sapiens miR-4448(20 nt) Read Sequence:01010101 (582 nt) =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Performing Scan: hsa-miR-4448 vs 01010101 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Score for this Scan: No Hits Found above Threshold Complete ou Read Sequence:hsa-miR-4701-3p MIMAT0019799 Homo sapiens miR-4701-3p(20 nt) Read Sequence:01010101 (582 nt) =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Performing Scan: hsa-miR-4701-3p vs 01010101 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Forward:Score: 140.00 Q:2 to 9 R:205 to 224 Align Len (7) (100.00%) (100.00%) Query:3' ugugguguggguAGUGGGUa 5' ||| Ref: 5' ccatgagcTCACCCAc 3' Energy: -12.41 kCal/Mol Scores for this hit: hsa-miR-4701-3p01010101140.00-12.412 9205 2247 100.00%100.00% Score for this Scan: Seq1,Seq2,Tot Score,Tot Energy,Max Score,Max Energy,Strand,Len1,Len2,Positions hsa-miR-4701-3p01010101140.00-12.41140.00-12.411524 20582 205 Complete A diferença é que em um não houve analise e em outro houve, o valor que esta em negrito é o que eu estou procurando. Hybrid so tem o seguinte formato: target: 01010101 length: 581 miRNA : hsa-miR-15a length: 22 mfe: -24.4 kcal/mol p-value: 0.334111 position 244 target 5' CUCUCCUGUGGUCUCU G U 3' CACA GACCAGUGCUGUU GUGU UUGGUCACGACGA miRNA 3' AAUAU 5' E o valor que me importa é o que esta em negrito. From: bruno.b...@gmail.com Date: Wed, 21 Nov 2012 14:21:18 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos breno++ 2012/11/21 breno br...@rio.pm.org Oi Aureliano, acho que o que o Tiago quis dizer é o que deveria estar acontecendo mas não está, e o que está acontecendo em vez disso? Assumindo que não há problema na lógica e o que está tentando resolver são os warnings que colou no final do paste, a resposta está na recomendação número 5 abaixo. Agora, algumas dicas gerais sobre o código que você colou: 1) a solução canônica para manipulação de listas são os módulos List::Util, List::MoreUtils e List::AllUtils (que agrega as funções de ambos). No List::MoreUtils (e, consequentemente, no List::AllUtils) há a função uniq() que faz o mesmo que o Array::Uniq. Então, a menos que você tenha um excelente motivo para usar o Array::Uniq, recomendo trocar para o List::MoreUtils. 2) Evite open() com apenas dois argumentos. Evite open() com barewords em vez de variáveis. Por mais que você saiba o que está fazendo, procure sempre manter a sintaxe: open my $fh, '', $nome_do_arquivo or die erro