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 Para: Nicole ; Perl Mongers Rio de Janeiro 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 Oi a todos, > >aproveitando a paciência infinita do Breno... > > >Poderias esclarecer como funciona isto: >(?...) > > >e o que acontece então aqui: > >"valores agrupados na regex por nome dentro do hash %+. No caso, >acessei o grupo (?) 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 >Para: Perl Mongers Rio de Janeiro >Enviadas: Sábado, 24 de Novembro de 2012 9:45 >Assunto: Re: [Rio-pm] Comparação de arquivos > > >2012/11/24 Aureliano Guedes : >> >> 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 (?\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 (?...) 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 (?) 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
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 > Oi a todos, > > aproveitando a paciência infinita do Breno... > > Poderias esclarecer como funciona isto: > (?...) > > e o que acontece então aqui: > "valores agrupados na regex por nome dentro do hash %+. No caso, > acessei o grupo (?) 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 > *Para:* Perl Mongers Rio de Janeiro > *Enviadas:* Sábado, 24 de Novembro de 2012 9:45 > *Assunto:* Re: [Rio-pm] Comparação de arquivos > > 2012/11/24 Aureliano Guedes : > > > > 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 (?\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 (?...) 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 (?) 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
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 /(?.+)/ por isso vc acessa $+{password} o quanto antes, pois a proxima operação de match vai resetar a variavel 2012/11/26 Nicole > Oi a todos, > > aproveitando a paciência infinita do Breno... > > Poderias esclarecer como funciona isto: > (?...) > > e o que acontece então aqui: > "valores agrupados na regex por nome dentro do hash %+. No caso, > acessei o grupo (?) 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 > *Para:* Perl Mongers Rio de Janeiro > *Enviadas:* Sábado, 24 de Novembro de 2012 9:45 > *Assunto:* Re: [Rio-pm] Comparação de arquivos > > 2012/11/24 Aureliano Guedes : > > > > 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 (?\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 (?...) 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 (?) 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
Oi a todos, aproveitando a paciência infinita do Breno... Poderias esclarecer como funciona isto: (?...) e o que acontece então aqui: "valores agrupados na regex por nome dentro do hash %+. No caso, acessei o grupo (?) 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 Para: Perl Mongers Rio de Janeiro Enviadas: Sábado, 24 de Novembro de 2012 9:45 Assunto: Re: [Rio-pm] Comparação de arquivos 2012/11/24 Aureliano Guedes : > > 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 (?\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 (?...) 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 (?) 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
se vc considerar o universo como o espaço também... 2012/11/26 Junior Moraes > Hi. > > Em 24 de novembro de 2012 22:03, Blabos de Blebe escreveu: > > "Três coisas são infinitas: o universo, a paciência do Breno e a > > > Mas se o universo está em constante expansão, ele não é infinito, certo? > Teoricamente o espaço é infinito, mas o universo não. Logo, a paciência do > breno está acima do universo. LOL > > []'s > > ___ > 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
Hi. Em 24 de novembro de 2012 22:03, Blabos de Blebe escreveu: > "Três coisas são infinitas: o universo, a paciência do Breno e a Mas se o universo está em constante expansão, ele não é infinito, certo? Teoricamente o espaço é infinito, mas o universo não. Logo, a paciência do breno está acima do universo. LOL []'s ___ 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" wrote: > Assim vcs me matam de vergonha =P > > []s > > -b > > 2012/11/24 Blabos de Blebe : > > "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 : > >> > >> On Nov 24, 2012 4:52 PM, "Aureliano Guedes" > 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 : > >>> > > > >>> > > 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 (?\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 (?...) 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 (?) 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/25 Tiago Peczenyj : > 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
Assim vcs me matam de vergonha =P []s -b 2012/11/24 Blabos de Blebe : > "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 : >> >> On Nov 24, 2012 4:52 PM, "Aureliano Guedes" 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 : >>> > > >>> > > 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 (?\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 (?...) 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 (?) 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/24 Aureliano Guedes : > 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
nem perl. senão ele saberia que o correto é $E = m*c**2 2012/11/25 Aureliano Guedes > > "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 : > > > > > > On Nov 24, 2012 4:52 PM, "Aureliano Guedes" > 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 : > > >> > > > > >> > > 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 (?\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 (?...) 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 (?) 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
> "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 : > > > > On Nov 24, 2012 4:52 PM, "Aureliano Guedes" 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 : > >> > > > >> > > 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 (?\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 (?...) 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 (?) 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
"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 : > > On Nov 24, 2012 4:52 PM, "Aureliano Guedes" 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 : >> > > >> > > 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 (?\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 (?...) 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 (?) 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
Re: [Rio-pm] Comparação de arquivos
On Nov 24, 2012 4:52 PM, "Aureliano Guedes" 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 : > > > > > > 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 (?\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 (?...) 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 (?) 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
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 > 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.html>Hard > 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.html>Close > 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.html>Ambiguously > 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.html>Regular > 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.html>Regular > 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.html>Hard > 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.html>Hard > 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.html>Close > 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.html>Ambiguously > 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.html>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>Regular > 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.html>Hard > 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 > > 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 : > > > Breno, que ser meu orientador... hahaha... > > > > > > Enfim, ficou assim http://pastebin.com/zrpLGwQs > > > &g
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 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 : > > 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
use o nivel 3 (mediano) 2012/11/24 Aureliano Guedes > 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 : > > > 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
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 : > > 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
2012/11/24 Aureliano Guedes : > 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
Breno, que ser meu orientador... hahaha... 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 : > > > > 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 (?\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 (?...) 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 (?) 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
2012/11/24 Aureliano Guedes : > > 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 (?\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 (?...) 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 (?) 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
Re: [Rio-pm] Comparação de arquivos
Opa, obrigado mesmo, de nada adianta pedir ajuda e a pessoa resolver o problema para você, é melhor que a pessoa indique o caminho certo, assim você aprende a fazer. Você, Breno esta me ajudando não a desenvolver esse script mas sim aprender como ser pratico, simples e usar boas praticas em qualquer script que eu possa desenvolver. Esse programa ja havia sido feito pelo meu ex-orientador (ele é biomedico) a um ano atraz, ele gastou 270 linhas de codigo, e o pior que criava 4 arquivos temporarios antes de criar o output, pensa no consumo de memoria... Eu não sou mais orientando dele mas participo do projeto ainda, e acho o programa dele feio e lento, por isso resolvi refazer, mais como passa tempo, e para ajudar quando tiver que usar denovo. E estou aprendendo muita coisa com isso. 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 $_ } } > Date: Sat, 24 Nov 2012 00:34:43 -0200 > From: br...@rio.pm.org > To: rio-pm@pm.org > Subject: Re: [Rio-pm] Comparação de arquivos > > 2012/11/23 Aureliano Guedes : > > 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 > p
Re: [Rio-pm] Comparação de arquivos
2012/11/23 Aureliano Guedes : > 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
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 : > > 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." > > > > Iss
Re: [Rio-pm] Comparação de arquivos
2012/11/22 Aureliano Guedes : > 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 = ( 'hsa-miR-16-1*' => '...', 'hsa-miR-17' => '...', ... ); depois, para cada item em %miranda, se a chave também existir em %hybrid, vc preenche o seu arquivo de saída com os valores que quiser, do jeito que quiser. Com isso vc de quebra dispensa o Array::Uniq e otimiza a sua lógica: foreach my $mirna (keys $miranda) { if (exists $hybrid{$mirna}) { say "o mirna $mirna existe em ambos os arquivos!"; say "miranda: $miranda{$mirna}"; say "hybrid: $hybrid{$mirna}"; } } []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 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 vo
Re: [Rio-pm] Comparação de arquivos
breno++ 2012/11/21 breno > 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 abrindo arquivo $nome_do_arquivo para leitura: $!"; > > para leitura, ou: > > open my $fh, '>' $nome_do_arquivo > or die "erro abrindo arquivo $nome_do_arquivo para escrita: $!"; > > Se quiser omitir o "or die..." basta colocar "use autodie;" no início > do seu programa. > > Mais ainda, pode usar módulos como Path::Class que já manipulam o > arquivo para você: > > use Path::Class; > > my $fh = file( 'meuarquivo.txt' )->openr(); # ou openw() para escrever > > Veja mais detalhes em https://metacpan.org/module/Path::Class::File > > > 3) Ao colar um exemplo, certifique-se que ele está limpo. A linha 75, > por exemplo, tenta abrir um arquivo para escrita: > > open SL, ">:raw", "sl.txt" or die $!; > > mas não faz nada com ele. > > > 4) Evite usar termos como new() e $self quando seu código não for > orientado a objetos. Essas não são palavras reservadas em Perl, mas > convenciona-se que new() constrói objetos e $self os referencia. Usar > esses nomes com outros objetivos confunde :) > > > 5) Evite "ações à distância" > ( > https://en.wikipedia.org/wiki/Action_at_a_distance_%28computer_programming%29 > ). > A variável especial $_, por exemplo, é global quando seu código espera > que ela seja local. Repare que você está consumindo seus dados usando > $_ implicitamente em 3 momentos distintos e concorrentes: > > foreach (@in) {# $_ definido como o valor atual em @in > > print find_m($_), find_h($_); > } > > sub find_m { > my $self = shift; > while () { # $_ redefinido, agora para a linha atual > ... > } > # ao final do bloco, $_ estará como undef (pois o arquivo acabou) > } > > idem para a sub find_h. > > A solução? Bom, a partir do Perl 5.10 (lançado a quase 5 anos atrás) é > possível usar uma versão léxica do $_ ao declará-lo no bloco com 'my'. > É possível também restaurar o valor global de $_ no escopo atual > usando 'our $_', mas não é isso o que você quer. Para deixar seu > código claro e evitar efeitos colaterais, sugiro sempre "dar nomes aos > bois" e nomear suas variáveis de loop. Por exemplo, trocar: > >foreach (@in) > > por > > foreach my $elemento (@in) > > já teria resolvido seu problema (assumindo, claro, que agora você > estaria passando "$elemento" para as funções, em vez de "$_"). > Recomendo mudar também no while() dentro das subs. > > Outro problema de 'action at a distance' no seu código, menos grave > mas ainda assim importante, é que você está usando nas funções find_m > e find_h handles abertos em outro bloco, referenciados pela mesma > bareword. Fiquei sem entender se a sua lógica considera o consumo > linear do arquivo (para cada ocorrencia em @in, os arquivos hybrid.txt > e miranda.txt estarão mais próximos do final) ou se isso é um bug. > > > 6) Não utilize 'our' quando não precisar - e você não precisa nesse > exemplo. Para saber mais sobre origem e diferenças entre my, our, > local e etc, recomendo a palestra do Util => > http://youtu.be/Ton-5tvDQiE > > > 7) Não utilize variáveis globais quando não precisar - e você não > precisa nesse exemplo. > > > 8) Não agrupe elementos em expressões regulares se não for utilizar. > Nas regexes das subs parsin_m() e find_m() você tem dois grupos > (parenteses () dentro da regex) e só usa o $1. > > > 9) Não manipule $/ diretamente. Se realmente precisar, faça "local $/ > = ..." dentro do bloco. > > > 10) Se as saídas de 'hybrid' e 'miranda' são sempre nesse formato, > crie um parser separadamente para elas e utilize em seu código. Deixa > tudo mais limpo e de quebra você ainda pode colocar no CPAN e ajudar > outras pessoas :) > > > 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 >
Re: [Rio-pm] Comparação de arquivos
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 abrindo arquivo $nome_do_arquivo para leitura: $!"; para leitura, ou: open my $fh, '>' $nome_do_arquivo or die "erro abrindo arquivo $nome_do_arquivo para escrita: $!"; Se quiser omitir o "or die..." basta colocar "use autodie;" no início do seu programa. Mais ainda, pode usar módulos como Path::Class que já manipulam o arquivo para você: use Path::Class; my $fh = file( 'meuarquivo.txt' )->openr(); # ou openw() para escrever Veja mais detalhes em https://metacpan.org/module/Path::Class::File 3) Ao colar um exemplo, certifique-se que ele está limpo. A linha 75, por exemplo, tenta abrir um arquivo para escrita: open SL, ">:raw", "sl.txt" or die $!; mas não faz nada com ele. 4) Evite usar termos como new() e $self quando seu código não for orientado a objetos. Essas não são palavras reservadas em Perl, mas convenciona-se que new() constrói objetos e $self os referencia. Usar esses nomes com outros objetivos confunde :) 5) Evite "ações à distância" (https://en.wikipedia.org/wiki/Action_at_a_distance_%28computer_programming%29). A variável especial $_, por exemplo, é global quando seu código espera que ela seja local. Repare que você está consumindo seus dados usando $_ implicitamente em 3 momentos distintos e concorrentes: foreach (@in) {# $_ definido como o valor atual em @in print find_m($_), find_h($_); } sub find_m { my $self = shift; while () { # $_ redefinido, agora para a linha atual ... } # ao final do bloco, $_ estará como undef (pois o arquivo acabou) } idem para a sub find_h. A solução? Bom, a partir do Perl 5.10 (lançado a quase 5 anos atrás) é possível usar uma versão léxica do $_ ao declará-lo no bloco com 'my'. É possível também restaurar o valor global de $_ no escopo atual usando 'our $_', mas não é isso o que você quer. Para deixar seu código claro e evitar efeitos colaterais, sugiro sempre "dar nomes aos bois" e nomear suas variáveis de loop. Por exemplo, trocar: foreach (@in) por foreach my $elemento (@in) já teria resolvido seu problema (assumindo, claro, que agora você estaria passando "$elemento" para as funções, em vez de "$_"). Recomendo mudar também no while() dentro das subs. Outro problema de 'action at a distance' no seu código, menos grave mas ainda assim importante, é que você está usando nas funções find_m e find_h handles abertos em outro bloco, referenciados pela mesma bareword. Fiquei sem entender se a sua lógica considera o consumo linear do arquivo (para cada ocorrencia em @in, os arquivos hybrid.txt e miranda.txt estarão mais próximos do final) ou se isso é um bug. 6) Não utilize 'our' quando não precisar - e você não precisa nesse exemplo. Para saber mais sobre origem e diferenças entre my, our, local e etc, recomendo a palestra do Util => http://youtu.be/Ton-5tvDQiE 7) Não utilize variáveis globais quando não precisar - e você não precisa nesse exemplo. 8) Não agrupe elementos em expressões regulares se não for utilizar. Nas regexes das subs parsin_m() e find_m() você tem dois grupos (parenteses () dentro da regex) e só usa o $1. 9) Não manipule $/ diretamente. Se realmente precisar, faça "local $/ = ..." dentro do bloco. 10) Se as saídas de 'hybrid' e 'miranda' são sempre nesse formato, crie um parser separadamente para elas e utilize em seu código. Deixa tudo mais limpo e de quebra você ainda pode colocar no CPAN e ajudar outras pessoas :) 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. 12) Sempre que o seu programa estiver fazendo algo estranho, tente diminuir ao máx
Re: [Rio-pm] Comparação de arquivos
Existem dois programas que fazem a mesma coisa, uma analise de energia de ligação entre miRNA e mRNA. Os arquivos de saida desses dois programas são diferentes, o algoritimo tambem é um pouco diferente o que pode gerar resultados diferentes. O que estou fazendo é comparando os resultados. O problema é que cada arquivo é uma lista de resultados, logo eu quero que os resultados da mesma analise fiquem segregados. Pode observar que as subrotinas parsin_h e parsin_m pegam uma palavra-chave, a segregação de resultados se baseia nessa palavra chave. From: tiago.pecze...@gmail.com Date: Tue, 20 Nov 2012 22:08:34 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Comparação de arquivos me desculpa mas... o que vc esta tentando fazer, antes que eu saia tentando entender o seu codigo? tipo que tipo de correlação vc tenta buscar? 2012/11/20 Aureliano Guedes Ola monges, Preciso saber o que estou errando aqui: http://pastebin.com/6jADqZi1 É para interagir com esses arquivos: hybrid: http://pastebin.com/9v6WFUT7 miranda: http://pastebin.com/qiYavtUe desde já obrigado. ___ 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
me desculpa mas... o que vc esta tentando fazer, antes que eu saia tentando entender o seu codigo? tipo que tipo de correlação vc tenta buscar? 2012/11/20 Aureliano Guedes > Ola monges, > > Preciso saber o que estou errando aqui: http://pastebin.com/6jADqZi1 > > É para interagir com esses arquivos: > > hybrid: http://pastebin.com/9v6WFUT7 > miranda: http://pastebin.com/qiYavtUe > > desde já obrigado. > > ___ > 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