Re: [Rio-pm] Comparação de arquivos

2012-11-26 Por tôpico Nicole Scherer
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

2012-11-26 Por tôpico Stanislaw Pusep
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

2012-11-26 Por tôpico Tiago Peczenyj
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

2012-11-26 Por tôpico 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

Re: [Rio-pm] Comparação de arquivos

2012-11-26 Por tôpico Tiago Peczenyj
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

2012-11-26 Por tôpico 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

Re: [Rio-pm] Comparação de arquivos

2012-11-25 Por tôpico Ole Peter Smith
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 Por tôpico breno
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

2012-11-25 Por tôpico breno
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-25 Por tôpico breno
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

2012-11-25 Por tôpico Tiago Peczenyj
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

2012-11-25 Por tôpico 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

Re: [Rio-pm] Comparação de arquivos

2012-11-24 Por tôpico 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


Re: [Rio-pm] Comparação de arquivos

2012-11-24 Por tôpico 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

Re: [Rio-pm] Comparação de arquivos

2012-11-24 Por tôpico Tiago Peczenyj
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

2012-11-24 Por tôpico Aureliano Guedes

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

2012-11-24 Por tôpico Tiago Peczenyj
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

2012-11-24 Por tôpico 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

Re: [Rio-pm] Comparação de arquivos

2012-11-24 Por tôpico breno
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

2012-11-24 Por tôpico Aureliano Guedes

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 Por tôpico breno
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

2012-11-24 Por tôpico Aureliano Guedes

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 Por tôpico breno
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

2012-11-23 Por tôpico 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?

- 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 Por tôpico breno
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

2012-11-22 Por tôpico 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?

- 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

2012-11-21 Por tôpico Bruno Buss
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

2012-11-21 Por tôpico 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
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

2012-11-20 Por tôpico Aureliano Guedes

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

2012-11-20 Por tôpico Tiago Peczenyj
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