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:
(?tag...) 

e o que acontece então aqui:

valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?mirna) fazendo $+{mirna};

Criaste um hash de nome %+  

É uma variável reservada?
Qual o valor que assume $mirna aqui?
Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key do 
hash %dados assim?

[]'s
Nicole Scherer





 De: breno br...@rio.pm.org
Para: Perl Mongers Rio de Janeiro rio-pm@pm.org 
Enviadas: Sábado, 24 de Novembro de 2012 9:45
Assunto: Re: [Rio-pm] Comparação de arquivos
 
2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:

 Se não for ser muito chato, como faço para seguir a forma abaixo:


 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
 modificar $/) e ir acumulando as linhas até encontrar um símbolo que
 indique nova entrada.

 seria algo do tipo:

 while ($fh){
 if(/primeira linha/){
 print $_;
 }
 elsif (/ultima linha/){
 #sair do loop
 }
 else {
 print $_
 }
 }


Algo como (atenção, código não testado):

---8---
my %dados = ();
my $mirna;
my $acumulador;

while (my $linha = $fh) {
   if ( $linha =~ m{tag magica (?mirna\S+)} ) {
      $dados{$mirna} = $acumulador if $mirna;
      $mirna = $+{mirna};
      $acumulador = q();
   }
   else {
      $acumulador .= $linha;
   }
}

use DDP; p %dados;

---8---

O que isso faz (ou deveria fazer: já mencionei que não testei?
Programar a essa hora da manhã não é meu forte, então favor
desconsiderar qualquer besteira):

1) le o arquivo linha por linha, atribuindo o valor de cada linha a
$linha (sem usar $_)
2) sempre que encontrar a tag mágica que separa entradas (estou
assumindo que a tag indica um novo registro que pode ser chave do seu
hash de dados:
2.1) se já estiver com um registro em memória ($mirna), bota os dados
acumulados ($acumulador) dentro do hash;
2.2) atribui à $mirna o novo registro encontrado. Note que estou
usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
(...). Isso funciona a partir do 5.10.0 e me permite acessar os
valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?mirna) fazendo $+{mirna};
2.2) zera o acumulador.
3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
não queira guardar alguma linha, por exemplo.
4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.


Entendeu?

[]s

-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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

/(?password.+)/

por isso vc acessa $+{password} o quanto antes, pois a proxima operação de
match vai resetar a variavel

2012/11/26 Nicole bionica2007-p...@yahoo.com

 Oi a todos,

 aproveitando a paciência infinita do Breno...

 Poderias esclarecer como funciona isto:
 (?tag...)

 e o que acontece então aqui:
 valores agrupados na regex por nome dentro do hash %+. No caso,
 acessei o grupo (?mirna) fazendo $+{mirna};

 Criaste um hash de nome %+ 
 É uma variável reservada?
 Qual o valor que assume $mirna aqui?
 Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key
 do hash %dados assim?

 []'s
 Nicole Scherer


   --
 *De:* breno br...@rio.pm.org
 *Para:* Perl Mongers Rio de Janeiro rio-pm@pm.org
 *Enviadas:* Sábado, 24 de Novembro de 2012 9:45
 *Assunto:* Re: [Rio-pm] Comparação de arquivos

 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
 
  Se não for ser muito chato, como faço para seguir a forma abaixo:
 
 
  2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
  modificar $/) e ir acumulando as linhas até encontrar um símbolo que
  indique nova entrada.
 
  seria algo do tipo:
 
  while ($fh){
  if(/primeira linha/){
  print $_;
  }
  elsif (/ultima linha/){
  #sair do loop
  }
  else {
  print $_
  }
  }
 

 Algo como (atenção, código não testado):

 ---8---
 my %dados = ();
 my $mirna;
 my $acumulador;

 while (my $linha = $fh) {
   if ( $linha =~ m{tag magica (?mirna\S+)} ) {
   $dados{$mirna} = $acumulador if $mirna;
   $mirna = $+{mirna};
   $acumulador = q();
   }
   else {
   $acumulador .= $linha;
   }
 }

 use DDP; p %dados;

 ---8---

 O que isso faz (ou deveria fazer: já mencionei que não testei?
 Programar a essa hora da manhã não é meu forte, então favor
 desconsiderar qualquer besteira):

 1) le o arquivo linha por linha, atribuindo o valor de cada linha a
 $linha (sem usar $_)
 2) sempre que encontrar a tag mágica que separa entradas (estou
 assumindo que a tag indica um novo registro que pode ser chave do seu
 hash de dados:
 2.1) se já estiver com um registro em memória ($mirna), bota os dados
 acumulados ($acumulador) dentro do hash;
 2.2) atribui à $mirna o novo registro encontrado. Note que estou
 usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
 (...). Isso funciona a partir do 5.10.0 e me permite acessar os
 valores agrupados na regex por nome dentro do hash %+. No caso,
 acessei o grupo (?mirna) fazendo $+{mirna};
 2.2) zera o acumulador.
 3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
 desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
 não queira guardar alguma linha, por exemplo.
 4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.


 Entendeu?

 []s

 -b
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm



 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm




-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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 bionica2007-p...@yahoo.com

 Oi a todos,

 aproveitando a paciência infinita do Breno...

 Poderias esclarecer como funciona isto:
 (?tag...)

 e o que acontece então aqui:
 valores agrupados na regex por nome dentro do hash %+. No caso,
 acessei o grupo (?mirna) fazendo $+{mirna};

 Criaste um hash de nome %+ 
 É uma variável reservada?
 Qual o valor que assume $mirna aqui?
 Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key
 do hash %dados assim?

 []'s
 Nicole Scherer


   --
 *De:* breno br...@rio.pm.org
 *Para:* Perl Mongers Rio de Janeiro rio-pm@pm.org
 *Enviadas:* Sábado, 24 de Novembro de 2012 9:45
 *Assunto:* Re: [Rio-pm] Comparação de arquivos

 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
 
  Se não for ser muito chato, como faço para seguir a forma abaixo:
 
 
  2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
  modificar $/) e ir acumulando as linhas até encontrar um símbolo que
  indique nova entrada.
 
  seria algo do tipo:
 
  while ($fh){
  if(/primeira linha/){
  print $_;
  }
  elsif (/ultima linha/){
  #sair do loop
  }
  else {
  print $_
  }
  }
 

 Algo como (atenção, código não testado):

 ---8---
 my %dados = ();
 my $mirna;
 my $acumulador;

 while (my $linha = $fh) {
   if ( $linha =~ m{tag magica (?mirna\S+)} ) {
   $dados{$mirna} = $acumulador if $mirna;
   $mirna = $+{mirna};
   $acumulador = q();
   }
   else {
   $acumulador .= $linha;
   }
 }

 use DDP; p %dados;

 ---8---

 O que isso faz (ou deveria fazer: já mencionei que não testei?
 Programar a essa hora da manhã não é meu forte, então favor
 desconsiderar qualquer besteira):

 1) le o arquivo linha por linha, atribuindo o valor de cada linha a
 $linha (sem usar $_)
 2) sempre que encontrar a tag mágica que separa entradas (estou
 assumindo que a tag indica um novo registro que pode ser chave do seu
 hash de dados:
 2.1) se já estiver com um registro em memória ($mirna), bota os dados
 acumulados ($acumulador) dentro do hash;
 2.2) atribui à $mirna o novo registro encontrado. Note que estou
 usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
 (...). Isso funciona a partir do 5.10.0 e me permite acessar os
 valores agrupados na regex por nome dentro do hash %+. No caso,
 acessei o grupo (?mirna) fazendo $+{mirna};
 2.2) zera o acumulador.
 3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
 desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
 não queira guardar alguma linha, por exemplo.
 4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.


 Entendeu?

 []s

 -b
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm



 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm

___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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 creakt...@gmail.com
Para: Nicole bionica2007-p...@yahoo.com; Perl Mongers Rio de Janeiro 
rio-pm@pm.org 
Enviadas: Segunda-feira, 26 de Novembro de 2012 11:01
Assunto: Re: [Rio-pm] Comparação de arquivos
 

Esta sintaxe de expressão regular é chamada de named capture. Surgiu no Perl 
v5.10. Ao invés de $1, $2, $3, ..., você dá um nome legível à captura.
Por si só, já é bastante útil, mas a utilidade maior aparece na possibilidade 
da construção de grammars, similares a BNF 
(https://pt.wikipedia.org/wiki/Formalismo_de_Backus-Naur#Exemplo).
Recomendo esse artigo para aprender a usar estes 
recursos: http://www.effectiveperlprogramming.com/blog/1479

ABS()




2012/11/26 Nicole bionica2007-p...@yahoo.com

Oi a todos,

aproveitando a paciência infinita do Breno...


Poderias esclarecer como funciona isto:
(?tag...) 


e o que acontece então aqui:

valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?mirna) fazendo $+{mirna};


Criaste um hash de nome %+  

É uma variável reservada?
Qual o valor que assume $mirna aqui?
Na primeira vez que entra no if, $mirna está vazio, não? Como pode ser key do 
hash %dados assim?


[]'s
Nicole Scherer







 De: breno br...@rio.pm.org
Para: Perl Mongers Rio de Janeiro rio-pm@pm.org 
Enviadas: Sábado, 24 de Novembro de 2012 9:45
Assunto: Re: [Rio-pm] Comparação de arquivos
 

2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:

 Se não for ser muito chato, como faço para seguir a forma abaixo:


 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
 modificar $/) e ir acumulando as linhas até encontrar um símbolo que
 indique nova entrada.

 seria algo do tipo:

 while ($fh){
 if(/primeira linha/){
 print $_;
 }
 elsif (/ultima linha/){
 #sair do loop
 }
 else {
 print $_
 }
 }


Algo como (atenção, código não testado):

---8---
my %dados = ();
my $mirna;
my $acumulador;

while (my $linha = $fh) {
   if ( $linha =~ m{tag
 magica (?mirna\S+)} ) {
      $dados{$mirna} = $acumulador if $mirna;
      $mirna = $+{mirna};
      $acumulador = q();
   }
   else {
      $acumulador .= $linha;
   }
}

use DDP; p %dados;

---8---

O que isso faz (ou deveria fazer: já mencionei que não testei?
Programar a essa hora da manhã não é meu forte, então favor
desconsiderar qualquer besteira):

1) le o arquivo linha por linha, atribuindo o valor de cada linha a
$linha (sem usar $_)
2) sempre que encontrar a tag mágica que separa entradas (estou
assumindo que a tag indica um novo registro que pode ser chave do seu
hash de dados:
2.1) se já estiver com um registro em memória ($mirna), bota os dados
acumulados ($acumulador) dentro do hash;
2.2) atribui à $mirna o novo registro encontrado. Note que
 estou
usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
(...). Isso funciona a partir do 5.10.0 e me permite acessar os
valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?mirna) fazendo $+{mirna};
2.2) zera o acumulador.
3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
não queira guardar alguma linha, por exemplo.
4) Depois do while vc pode inspecionar %dados para saber se está tudo ok.


Entendeu?

[]s

-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm



___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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 ole@gmail.com:
 
  On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote:
 
  Breno, que ser meu orientador... hahaha...
 
  se eu era reitor universitario, eu daria o grau de dr honoratis para o este
  nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de
  enseminar conhecimentos
 
  0le
 
 
 
  Enfim, ficou assim http://pastebin.com/zrpLGwQs
 
  Ha algo que você mudaria???
 
   Date: Sat, 24 Nov 2012 09:45:41 -0200
 
   From: br...@rio.pm.org
   To: rio-pm@pm.org
   Subject: Re: [Rio-pm] Comparação de arquivos
  
   2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
   
Se não for ser muito chato, como faço para seguir a forma abaixo:
   
   
2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
modificar $/) e ir acumulando as linhas até encontrar um símbolo que
indique nova entrada.
   
seria algo do tipo:
   
while ($fh){
if(/primeira linha/){
print $_;
}
elsif (/ultima linha/){
#sair do loop
}
else {
print $_
}
}
   
  
   Algo como (atenção, código não testado):
  
   ---8---
   my %dados = ();
   my $mirna;
   my $acumulador;
  
   while (my $linha = $fh) {
   if ( $linha =~ m{tag magica (?mirna\S+)} ) {
   $dados{$mirna} = $acumulador if $mirna;
   $mirna = $+{mirna};
   $acumulador = q();
   }
   else {
   $acumulador .= $linha;
   }
   }
  
   use DDP; p %dados;
  
   ---8---
  
   O que isso faz (ou deveria fazer: já mencionei que não testei?
   Programar a essa hora da manhã não é meu forte, então favor
   desconsiderar qualquer besteira):
  
   1) le o arquivo linha por linha, atribuindo o valor de cada linha a
   $linha (sem usar $_)
   2) sempre que encontrar a tag mágica que separa entradas (estou
   assumindo que a tag indica um novo registro que pode ser chave do seu
   hash de dados:
   2.1) se já estiver com um registro em memória ($mirna), bota os dados
   acumulados ($acumulador) dentro do hash;
   2.2) atribui à $mirna o novo registro encontrado. Note que estou
   usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
   (...). Isso funciona a partir do 5.10.0 e me permite acessar os
   valores agrupados na regex por nome dentro do hash %+. No caso,
   acessei o grupo (?mirna) fazendo $+{mirna};
   2.2) zera o acumulador.
   3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
   desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
   não queira guardar alguma linha, por exemplo.
   4) Depois do while vc pode inspecionar %dados para saber se está tudo
   ok.
  
  
   Entendeu?
  
   []s
  
   -b
   ___
   Rio-pm mailing list
   Rio-pm@pm.org
   http://mail.pm.org/mailman/listinfo/rio-pm
 
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm
 
 
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

2012-11-25 Por tôpico Tiago Peczenyj
nem perl. senão ele saberia que o correto é

$E = m*c**2

2012/11/25 Aureliano Guedes guedes_1...@hotmail.com

   Três coisas são infinitas: o universo, a paciência do Breno e a
  estupidez humana. Mas, no que respeita ao universo, ainda não adquiri
  a certeza absoluta.

 Albert Einstein não conhecia essa variável na época.

  From: bla...@gmail.com
  Date: Sat, 24 Nov 2012 22:03:50 -0200

  To: rio-pm@pm.org
  Subject: Re: [Rio-pm] Comparação de arquivos
 
  Três coisas são infinitas: o universo, a paciência do Breno e a
  estupidez humana. Mas, no que respeita ao universo, ainda não adquiri
  a certeza absoluta.
 
  2012/11/24 Ole Peter Smith ole@gmail.com:
  
   On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com
 wrote:
  
   Breno, que ser meu orientador... hahaha...
  
   se eu era reitor universitario, eu daria o grau de dr honoratis para o
 este
   nosso breno, pela sua competencia, vastoconhecimento e infinita
 paciencia de
   enseminar conhecimentos
  
   0le
  
  
  
   Enfim, ficou assim http://pastebin.com/zrpLGwQs
  
   Ha algo que você mudaria???
  
Date: Sat, 24 Nov 2012 09:45:41 -0200
  
From: br...@rio.pm.org
To: rio-pm@pm.org
Subject: Re: [Rio-pm] Comparação de arquivos
   
2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:

 Se não for ser muito chato, como faço para seguir a forma abaixo:


 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
 modificar $/) e ir acumulando as linhas até encontrar um símbolo
 que
 indique nova entrada.

 seria algo do tipo:

 while ($fh){
 if(/primeira linha/){
 print $_;
 }
 elsif (/ultima linha/){
 #sair do loop
 }
 else {
 print $_
 }
 }

   
Algo como (atenção, código não testado):
   
---8---
my %dados = ();
my $mirna;
my $acumulador;
   
while (my $linha = $fh) {
if ( $linha =~ m{tag magica (?mirna\S+)} ) {
$dados{$mirna} = $acumulador if $mirna;
$mirna = $+{mirna};
$acumulador = q();
}
else {
$acumulador .= $linha;
}
}
   
use DDP; p %dados;
   
---8---
   
O que isso faz (ou deveria fazer: já mencionei que não testei?
Programar a essa hora da manhã não é meu forte, então favor
desconsiderar qualquer besteira):
   
1) le o arquivo linha por linha, atribuindo o valor de cada linha a
$linha (sem usar $_)
2) sempre que encontrar a tag mágica que separa entradas (estou
assumindo que a tag indica um novo registro que pode ser chave do
 seu
hash de dados:
2.1) se já estiver com um registro em memória ($mirna), bota os
 dados
acumulados ($acumulador) dentro do hash;
2.2) atribui à $mirna o novo registro encontrado. Note que estou
usando grupos nomeados na regex, fazendo (?tag...) em vez de
 apenas
(...). Isso funciona a partir do 5.10.0 e me permite acessar os
valores agrupados na regex por nome dentro do hash %+. No caso,
acessei o grupo (?mirna) fazendo $+{mirna};
2.2) zera o acumulador.
3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
desse 'else' vc pode fazer coisas como next if $linha =~ /.../
 caso
não queira guardar alguma linha, por exemplo.
4) Depois do while vc pode inspecionar %dados para saber se está
 tudo
ok.
   
   
Entendeu?
   
[]s
   
-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm
  
   ___
   Rio-pm mailing list
   Rio-pm@pm.org
   http://mail.pm.org/mailman/listinfo/rio-pm
  
  
   ___
   Rio-pm mailing list
   Rio-pm@pm.org
   http://mail.pm.org/mailman/listinfo/rio-pm
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm

 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm




-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

2012-11-25 Por tôpico breno
2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
 Tem muitas coisas que posso desconsiderar desse perlcritc, ne?!


No livro, cada recomendação acompanha uma breve discussão com
motivações, edge cases, exemplos e alternativas. O ideal é que vc leia
e tire suas próprias conclusões. Depois, pode criar seu próprio
arquivo .perlcriticrc apenas com as regras que deseja reforçar.
Algumas pessoas criaram suas próprias regras também, e colocaram no
CPAN. Procure por Perl::Critic e Perl::Critic::Profile para mais
detalhes.

Eu gosto bastante do Perl Best Practices. Preste apenas um pouco
mais de atenção quando o Damian recomenda um ou outro módulo: o livro
é antigo (já tem mais de 7 anos), e muitos módulos deixaram de ser
mantidos ou provaram ser mais problemáticos do que benéficos, enquanto
outros padrões de-facto surgiram (como Moose). Para uma referência
mais atualizada dos módulos citados, veja
https://www.socialtext.net/perl5/pbp_module_recommendation_commentary

Independente do que escolha, o mais importante é consistência. Se
escolher um padrão ou conjunto de regras particulares de
desenvolvimento, certifique-se de que elas valem para todo o código :)

[]s

-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


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

2012-11-25 Por tôpico breno
Assim vcs me matam de vergonha =P

[]s

-b

2012/11/24 Blabos de Blebe bla...@gmail.com:
 Três coisas são infinitas: o universo, a paciência do Breno e a
 estupidez humana. Mas, no que respeita ao universo, ainda não adquiri
 a certeza absoluta.

 2012/11/24 Ole Peter Smith ole@gmail.com:

 On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote:

 Breno, que ser meu orientador... hahaha...

 se eu era reitor universitario, eu daria o grau de dr honoratis para o este
 nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia de
 enseminar conhecimentos

 0le



 Enfim, ficou assim http://pastebin.com/zrpLGwQs

 Ha algo que você mudaria???

  Date: Sat, 24 Nov 2012 09:45:41 -0200

  From: br...@rio.pm.org
  To: rio-pm@pm.org
  Subject: Re: [Rio-pm] Comparação de arquivos
 
  2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
  
   Se não for ser muito chato, como faço para seguir a forma abaixo:
  
  
   2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
   modificar $/) e ir acumulando as linhas até encontrar um símbolo que
   indique nova entrada.
  
   seria algo do tipo:
  
   while ($fh){
   if(/primeira linha/){
   print $_;
   }
   elsif (/ultima linha/){
   #sair do loop
   }
   else {
   print $_
   }
   }
  
 
  Algo como (atenção, código não testado):
 
  ---8---
  my %dados = ();
  my $mirna;
  my $acumulador;
 
  while (my $linha = $fh) {
  if ( $linha =~ m{tag magica (?mirna\S+)} ) {
  $dados{$mirna} = $acumulador if $mirna;
  $mirna = $+{mirna};
  $acumulador = q();
  }
  else {
  $acumulador .= $linha;
  }
  }
 
  use DDP; p %dados;
 
  ---8---
 
  O que isso faz (ou deveria fazer: já mencionei que não testei?
  Programar a essa hora da manhã não é meu forte, então favor
  desconsiderar qualquer besteira):
 
  1) le o arquivo linha por linha, atribuindo o valor de cada linha a
  $linha (sem usar $_)
  2) sempre que encontrar a tag mágica que separa entradas (estou
  assumindo que a tag indica um novo registro que pode ser chave do seu
  hash de dados:
  2.1) se já estiver com um registro em memória ($mirna), bota os dados
  acumulados ($acumulador) dentro do hash;
  2.2) atribui à $mirna o novo registro encontrado. Note que estou
  usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
  (...). Isso funciona a partir do 5.10.0 e me permite acessar os
  valores agrupados na regex por nome dentro do hash %+. No caso,
  acessei o grupo (?mirna) fazendo $+{mirna};
  2.2) zera o acumulador.
  3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
  desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
  não queira guardar alguma linha, por exemplo.
  4) Depois do while vc pode inspecionar %dados para saber se está tudo
  ok.
 
 
  Entendeu?
 
  []s
 
  -b
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm

 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm


 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


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

2012-11-25 Por tôpico breno
2012/11/25 Tiago Peczenyj tiago.pecze...@gmail.com:
 nem perl. senão ele saberia que o correto é

 $E = m*c**2


ou, para cobrir todos os casos,

-8-
use bignum;
use constant c = 299_792_458;
my $m = massa();
my $p = momentum();

my $E = sqrt( ($m * c**2)**2 + ($p * c)**2 );
-8-

=P

[]s

-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


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

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 br...@rio.pm.org wrote:

 Assim vcs me matam de vergonha =P

 []s

 -b

 2012/11/24 Blabos de Blebe bla...@gmail.com:
  Três coisas são infinitas: o universo, a paciência do Breno e a
  estupidez humana. Mas, no que respeita ao universo, ainda não adquiri
  a certeza absoluta.
 
  2012/11/24 Ole Peter Smith ole@gmail.com:
 
  On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com
 wrote:
 
  Breno, que ser meu orientador... hahaha...
 
  se eu era reitor universitario, eu daria o grau de dr honoratis para o
 este
  nosso breno, pela sua competencia, vastoconhecimento e infinita
 paciencia de
  enseminar conhecimentos
 
  0le
 
 
 
  Enfim, ficou assim http://pastebin.com/zrpLGwQs
 
  Ha algo que você mudaria???
 
   Date: Sat, 24 Nov 2012 09:45:41 -0200
 
   From: br...@rio.pm.org
   To: rio-pm@pm.org
   Subject: Re: [Rio-pm] Comparação de arquivos
  
   2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
   
Se não for ser muito chato, como faço para seguir a forma abaixo:
   
   
2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
modificar $/) e ir acumulando as linhas até encontrar um símbolo
 que
indique nova entrada.
   
seria algo do tipo:
   
while ($fh){
if(/primeira linha/){
print $_;
}
elsif (/ultima linha/){
#sair do loop
}
else {
print $_
}
}
   
  
   Algo como (atenção, código não testado):
  
   ---8---
   my %dados = ();
   my $mirna;
   my $acumulador;
  
   while (my $linha = $fh) {
   if ( $linha =~ m{tag magica (?mirna\S+)} ) {
   $dados{$mirna} = $acumulador if $mirna;
   $mirna = $+{mirna};
   $acumulador = q();
   }
   else {
   $acumulador .= $linha;
   }
   }
  
   use DDP; p %dados;
  
   ---8---
  
   O que isso faz (ou deveria fazer: já mencionei que não testei?
   Programar a essa hora da manhã não é meu forte, então favor
   desconsiderar qualquer besteira):
  
   1) le o arquivo linha por linha, atribuindo o valor de cada linha a
   $linha (sem usar $_)
   2) sempre que encontrar a tag mágica que separa entradas (estou
   assumindo que a tag indica um novo registro que pode ser chave do seu
   hash de dados:
   2.1) se já estiver com um registro em memória ($mirna), bota os dados
   acumulados ($acumulador) dentro do hash;
   2.2) atribui à $mirna o novo registro encontrado. Note que estou
   usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
   (...). Isso funciona a partir do 5.10.0 e me permite acessar os
   valores agrupados na regex por nome dentro do hash %+. No caso,
   acessei o grupo (?mirna) fazendo $+{mirna};
   2.2) zera o acumulador.
   3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
   desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
   não queira guardar alguma linha, por exemplo.
   4) Depois do while vc pode inspecionar %dados para saber se está tudo
   ok.
  
  
   Entendeu?
  
   []s
  
   -b
   ___
   Rio-pm mailing list
   Rio-pm@pm.org
   http://mail.pm.org/mailman/listinfo/rio-pm
 
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm
 
 
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm

___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

2012-11-24 Por tôpico breno
2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
 Breno, que ser meu orientador... hahaha...

 Enfim, ficou assim http://pastebin.com/zrpLGwQs

 Ha algo que você mudaria???


Sempre há :)

Particularmente, não gosto dessa sua chamada a main() no final do
arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o
seu código (instruções podem aparecer a qualquer momento fora de uma
sub, o figura tem que passar por todo o seu script até saber que vc só
está chamando main()). Eu trocaria a ordem, deixando assim:

8
use strict;
use warnings;
use autodie;

main();
exit;

# declaracoes de sub aqui embaixo
8

Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao
leitor que não haverão surpresas no meio das subs.

No mais, experimente usar o Perl::Critic (dá até pra usar online via
perlcritic.com) e veja se ele reclama de alguma coisa.

[]s

-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


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

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 guedes_1...@hotmail.com:
  Breno, que ser meu orientador... hahaha...
 
  Enfim, ficou assim http://pastebin.com/zrpLGwQs
 
  Ha algo que você mudaria???
 
 
 Sempre há :)
 
 Particularmente, não gosto dessa sua chamada a main() no final do
 arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o
 seu código (instruções podem aparecer a qualquer momento fora de uma
 sub, o figura tem que passar por todo o seu script até saber que vc só
 está chamando main()). Eu trocaria a ordem, deixando assim:
 
 8
 use strict;
 use warnings;
 use autodie;
 
 main();
 exit;
 
 # declaracoes de sub aqui embaixo
 8
 
 Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao
 leitor que não haverão surpresas no meio das subs.
 
 No mais, experimente usar o Perl::Critic (dá até pra usar online via
 perlcritic.com) e veja se ele reclama de alguma coisa.
 
 []s
 
 -b
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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 guedes_1...@hotmail.com






Opa, obrigado então por toda ajuda.

No mais, so o log do perlcritc.

http://pastebin.com/esYuR04J

tenso, ne?!

 Date: Sat, 24 Nov 2012 18:01:13 -0200


 From: br...@rio.pm.org
 To: rio-pm@pm.org
 Subject: Re: [Rio-pm] Comparação de arquivos
 


 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
  Breno, que ser meu orientador... hahaha...
 


  Enfim, ficou assim http://pastebin.com/zrpLGwQs
 
  Ha algo que você mudaria???
 
 
 Sempre há :)
 


 Particularmente, não gosto dessa sua chamada a main() no final do
 arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o
 seu código (instruções podem aparecer a qualquer momento fora de uma


 sub, o figura tem que passar por todo o seu script até saber que vc só
 está chamando main()). Eu trocaria a ordem, deixando assim:
 
 8
 use strict;


 use warnings;
 use autodie;
 
 main();
 exit;
 
 # declaracoes de sub aqui embaixo
 8
 
 Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao


 leitor que não haverão surpresas no meio das subs.
 
 No mais, experimente usar o Perl::Critic (dá até pra usar online via
 perlcritic.com) e veja se ele reclama de alguma coisa.


 
 []s
 
 -b
 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm


  

___

Rio-pm mailing list

Rio-pm@pm.org

http://mail.pm.org/mailman/listinfo/rio-pm


-- 
Tiago B. Peczenyj
Linux User #405772



http://pacman.blog.br


___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm  
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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 guedes_1...@hotmail.com

  Tem muitas coisas que posso desconsiderar desse perlcritc, ne?!

 agora em

 Regular expression without /x flag at line 49, column 18. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#49  See page 236 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.html

 fiquei sem entender, pra que esse maldito /x, não me parece que va mudar
 muita coisa.

 Mas legal, se jogar no nivel  parece ajudar muito... vou ler o PBP

 Hard tabs used at line 15, column 12. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#15  See page 20 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlHard
  tabs used at line 17, column 17. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#17  See page 20 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlClose
  filehandles as soon as possible after opening them at line 18, column 2. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#18  See page 209 of PBP.  
 Severity: 4 
 http://perlcritic.com/pod/Perl/Critic/Policy/InputOutput/RequireBriefOpen.htmlAmbiguously
  named variable record at line 20, column 2. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#20  See page 48 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/NamingConventions/ProhibitAmbiguousNames.htmlRegular
  expression without /x flag at line 23, column 18. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#23  See page 236 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlRegular
  expression without /x flag at line 29, column 20. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#29  See page 236 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlHard
  tabs used at line 41, column 13. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#41  See page 20 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlHard
  tabs used at line 43, column 17. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#43  See page 20 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.htmlClose
  filehandles as soon as possible after opening them at line 44, column 2. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#44  See page 209 of PBP.  
 Severity: 4 
 http://perlcritic.com/pod/Perl/Critic/Policy/InputOutput/RequireBriefOpen.htmlAmbiguously
  named variable record at line 46, column 2. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#46  See page 48 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/NamingConventions/ProhibitAmbiguousNames.htmlRegular
  expression without /x flag at line 49, column 18. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#49  See page 236 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlRegular
  expression without /x flag at line 56, column 25. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#56  See page 236 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/RegularExpressions/RequireExtendedFormatting.htmlHard
  tabs used at line 58, column 4. 
 http://perlcritic.com/tmp/ovXTXZfUGR.html#58  See page 20 of PBP.  
 Severity: 3 
 http://perlcritic.com/pod/Perl/Critic/Policy/CodeLayout/ProhibitHardTabs.html



 --
 From: tiago.pecze...@gmail.com
 Date: Sat, 24 Nov 2012 18:15:36 -0200

 To: rio-pm@pm.org
 Subject: Re: [Rio-pm] Comparação de arquivos

 use o nivel 3 (mediano)

 2012/11/24 Aureliano Guedes guedes_1...@hotmail.com

  Opa, obrigado então por toda ajuda.

 No mais, so o log do perlcritc.

 http://pastebin.com/esYuR04J

 tenso, ne?!

  Date: Sat, 24 Nov 2012 18:01:13 -0200

  From: br...@rio.pm.org
  To: rio-pm@pm.org
  Subject: Re: [Rio-pm] Comparação de arquivos
 
  2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
   Breno, que ser meu orientador... hahaha...
  
   Enfim, ficou assim http://pastebin.com/zrpLGwQs
  
   Ha algo que você mudaria???
  
 
  Sempre há :)
 
  Particularmente, não gosto dessa sua chamada a main() no final do
  arquivo, pq esconde a lógica e dá pouca confiança a quem vai olhar o
  seu código (instruções podem aparecer a qualquer momento fora de uma
  sub, o figura tem que passar por todo o seu script até saber que vc só
  está chamando main()). Eu trocaria a ordem, deixando assim:
 
  8
  use strict;
  use warnings;
  use autodie;
 
  main();
  exit;
 
  # declaracoes de sub aqui embaixo
  8
 
  Assim vc deixa claro o (começo do) fluxo do seu programa e mostra ao
  leitor que não haverão surpresas no meio das subs

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

2012-11-24 Por tôpico Ole Peter Smith
On Nov 24, 2012 4:52 PM, Aureliano Guedes guedes_1...@hotmail.com wrote:

 Breno, que ser meu orientador... hahaha...

se eu era reitor universitario, eu daria o grau de dr honoratis para o este
nosso breno, pela sua competencia, vastoconhecimento e infinita paciencia
de enseminar conhecimentos

0le

 Enfim, ficou assim http://pastebin.com/zrpLGwQs

 Ha algo que você mudaria???

  Date: Sat, 24 Nov 2012 09:45:41 -0200

  From: br...@rio.pm.org
  To: rio-pm@pm.org
  Subject: Re: [Rio-pm] Comparação de arquivos
 
  2012/11/24 Aureliano Guedes guedes_1...@hotmail.com:
  
   Se não for ser muito chato, como faço para seguir a forma abaixo:
  
  
   2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
   modificar $/) e ir acumulando as linhas até encontrar um símbolo que
   indique nova entrada.
  
   seria algo do tipo:
  
   while ($fh){
   if(/primeira linha/){
   print $_;
   }
   elsif (/ultima linha/){
   #sair do loop
   }
   else {
   print $_
   }
   }
  
 
  Algo como (atenção, código não testado):
 
  ---8---
  my %dados = ();
  my $mirna;
  my $acumulador;
 
  while (my $linha = $fh) {
  if ( $linha =~ m{tag magica (?mirna\S+)} ) {
  $dados{$mirna} = $acumulador if $mirna;
  $mirna = $+{mirna};
  $acumulador = q();
  }
  else {
  $acumulador .= $linha;
  }
  }
 
  use DDP; p %dados;
 
  ---8---
 
  O que isso faz (ou deveria fazer: já mencionei que não testei?
  Programar a essa hora da manhã não é meu forte, então favor
  desconsiderar qualquer besteira):
 
  1) le o arquivo linha por linha, atribuindo o valor de cada linha a
  $linha (sem usar $_)
  2) sempre que encontrar a tag mágica que separa entradas (estou
  assumindo que a tag indica um novo registro que pode ser chave do seu
  hash de dados:
  2.1) se já estiver com um registro em memória ($mirna), bota os dados
  acumulados ($acumulador) dentro do hash;
  2.2) atribui à $mirna o novo registro encontrado. Note que estou
  usando grupos nomeados na regex, fazendo (?tag...) em vez de apenas
  (...). Isso funciona a partir do 5.10.0 e me permite acessar os
  valores agrupados na regex por nome dentro do hash %+. No caso,
  acessei o grupo (?mirna) fazendo $+{mirna};
  2.2) zera o acumulador.
  3) se não encontrar a tag mágica, vai acumulando os dados. Dentro
  desse 'else' vc pode fazer coisas como next if $linha =~ /.../ caso
  não queira guardar alguma linha, por exemplo.
  4) Depois do while vc pode inspecionar %dados para saber se está tudo
ok.
 
 
  Entendeu?
 
  []s
 
  -b
  ___
  Rio-pm mailing list
  Rio-pm@pm.org
  http://mail.pm.org/mailman/listinfo/rio-pm

 ___
 Rio-pm mailing list
 Rio-pm@pm.org
 http://mail.pm.org/mailman/listinfo/rio-pm
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

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

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 guedes_1...@hotmail.com:
  Opa, obrigado pela ajuda e pelas preciosas dicas.
 
  - Não achei uma função no List::MoreUtils que fizesse o mesmo que o dups do
  Array::Uniq, tem alguma função no List::MoreUtils que crie um terceiro array
  apenas com itens que outros dois ou mais arrays tem em igual?
 
 
 Tem razão, Aureliano. A função dup() do List::MoreUtils remove
 duplicatas, não as retorna para você. Se o Array::Uniq te atende
 então, maravilha. Se preferir resolver direto no Perl, seguem algumas
 alternativas (só por desencargo mesmo):
 
 
 my %duplicadas = ();
 my %visitadas  = ();
 foreach (@a, @b) {
   $visitadas{$_}++  $duplicadas{$_}++;
 }
 my @resultado = sort keys %duplicadas;
 
 my @resultado = ();
 foreach my $item (sort @b) {
   push @resultado, $item if any { $item eq $_ } @a;
 }
 
 my %visitadas = ();
 my @resultado = sort grep { $visitadas{$_}++ == 1 } @a, @b;
 
 
  - Particularmente não vi vantagem em usar o Path::Class, para meu caso qual
  seria a vantagem?
 
 
 O Path::Class resolve um monte de coisas pra vc. Hoje você abre
 arquivos no mesmo diretório. Se amanhã quiser usar diretórios
 diferentes, cada sistema tem um separador diferente ('/', '\', etc). O
 Path::Class faz isso pra vc. Outro motivo é a preguiça. Escrever:
 
 my $fh = file( $nome_do_arquivo )-openr;
 
 é a mesma coisa que escrever:
 
 open my $fh, '', $nome_do_arquivo
   or Carp::croak error opening file $nome_do_arquivo: $!\n;
 
 Se vc só vai fazer isso, tudo bem. Mas quando começa a ter que passear
 e manipular arquivos e diretórios, acredite: faz toda a diferença :)
 
 Independente do que escolher, lembre-se sempre de testar o valor de
 retorno de funções como open(), bem como usar open() sempre com 3
 argumentos!
 
  - Quanto a criar um modulo fazendo o que as subs fazem, depois vou pensar
  nessa hipotese, mais um modulo para o BioPerl não faz mal.
 
 
 Maravilha!
 
  - Quanto ao que você falou no item 11:
 
  - Continuei usando barewords pois não deu certo usando strings, por algum
  motivo que não sei por que? (Afinal qual o problema das barewords?)
 
 
 Não diga não deu certo, nos diga o erro!
 
 Barewords são problemáticas por diversos motivos, o principal deles é
 que são globais. Lembra dos bugs de ação à distância? Pois é, se vc
 usar sem querer o mesmo nome de file handle (digamos, FH, FILE,
 ARQ ou equivalente) em diferentes lugares, seu programa vai se
 comportar de maneira estranha e vc não vai ter idéia do motivo. Por
 mais que você ache que seu programa é pequeno e controlável agora, é o
 tipo de boa prática que compensa *muito* a medida que o programa
 escala (ou o tempo passa e vc tem q manter o código 6 meses depois).
 
 Variáveis podem ser utilizadas como filehandle desde o Perl 5.6.0, de
 12 anos atrás. Desde então, esse tem sido o meio recomendado para
 lidar com arquivos - a menos que vc esteja fazendo um oneliner rápido
 na linha de comando, ou lidando com handles nativos como STDIN,
 STDOUT, DATA, etc.
 
 
  11) No seu código você abre os arquivos 'hybrid.txt' e 'miranda.txt'
  duas vezes para leitura. Isso normalmente significa que você poderia
  ter colocado tudo numa estrutura de fácil acesso e manipulação, e lido
  o arquivo apenas uma vez (operações de E/S costumam ser bem mais
  pesadas do que manipulação em memória). Dica: sempre que tiver mais de
  um while() ou foreach() varrendo a mesma estrutura para ler dados, é
  bem possível que você possa otimizar e deixar mais claro seu algoritmo
  fazendo a varredura apenas uma vez.
 
  Isso me preocupou, veja bem, não consegui pensar em uma forma de varrer o
  arquivo fazendo o que preciso apenas em um laço.
  parsin_h e parsin_m extraem um valor que são gravados em array, @inh e @inm
  respectivamente, depois um terceiro array (@in) é criado apenas com os
  valores que @inh e @inm tem em comum.
  Os valores de @in são a referencia de o que eu quero extrair dos arquivos
  hybrid.txt e miranda.txt.
 
 
 Você pode por exemplo passar uma vez só em cada arquivo e armazenar os
 elementos como pares chave-valor, por exemplo:
 
 my %miranda = (
'hsa-miR-15a' = '...',
'hsa-miR-16' = '...',
...
 );
 
 my %hybrid

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

2012-11-23 Por tôpico breno
2012/11/23 Aureliano Guedes guedes_1...@hotmail.com:
 Breno, valeu mesmo por mais dicas preciosas, dessa ultima forma que me falou
 foi bem mais facil codar. A logica foi super-simples mas não fui capaz de
 pensar nisso sozinho.

 Mais ainda estou com um problema e uma duvida.

 - devido o $/ o print não esta saindo completo, vem faltando parte do
 documento, justamente o valor de $/. Como resolver isso?


Várias formas diferentes. Seguem duas de exemplo:

1) concatenar $/ ao final da sua string na hora de atribuir;
2) trocar de abordagem, fazendo seu parser ler linha a linha (sem
modificar $/) e ir acumulando as linhas até encontrar um símbolo que
indique nova entrada. Eu prefiro essa abordagem pq facilita (pra mim)
a compreensão e ajuda (para todos) a alteração/extensão futura do seu
parser, caso vc queira em algum momento separar os valores de cada
registro em subgrupos, por exemplo.

Note ainda que, se for possivel interagir com os dados dos programas
internos mais diretamente (por exemplo, através de wrappers de alguma
API) em vez de analisando essa saída, você provavelmente conseguirá
mais flexibilidade na leitura e interpretação dos dados de saida.

 - Não entendo o que você quer dizer com testar o valor de retorno de
 funções como open()?


Funções que acessam o sistema de arquivos tem uma propensão muito
maior em falhar, por motivos como muitos arquivos abertos, erro de
disco, arquivo não encontrado, só pra citar alguns. Digamos, por
exemplo, que você faça:

  open my $fh, '', 'miranda.txt';
  while (my $linha = $fh) {
 print $linha;
  }
  close $fh;

E se vc rodar o programa de um diretório errado e, por isso, ele não
achar o 'miranda.txt'? Você não vai receber nenhuma resposta (porque
está ignorando o valor de retorno da open()), seu programa vai
continuar rodando como se nada tivesse acontecido, e operações com o
handle vão falhar silenciosamente. Por isso escrevemos:

  open my $fh, '', 'miranda.txt' or die $!;

o or die testa o valor de retorno da função open(). Se open() falhou
ao abrir o arquivo, ela retorna undef e registra o erro na variável
especial $!. O que o or die está fazendo é: rode o open() ou, se o
open() falhar, morra exibindo a mensagem em $!. Entendeu?

A maioria das pessoas bota o or die pelo menos depois de um open(),
mas a verdade é que várias outras funções podem falhar sem vc ficar
sabendo. Por isso o ideal é vc testar o valor de retorno de todas as
funções, em especial as que envolvem I/O. Mas convenhamos, isso é
chatíssimo. Já pensou fazer print $fh q{lalala} or die 'erro
escrevendo em arquivo' cada vez que for fazer um print? Quando vc usa
o pragma autodie, ele muda essas funções para que elas gerem excessões
fatais caso falhem, de modo que tudo que vc precisa fazer é escrever:

   use autodie;

no início do seu programa e não se preocupar mais. A partir daí, não
precisa botar or die nenhum. Sempre que a função falhar (seja
open(), close(), print() e várias outras) ela vai gerar uma exceção
fatal imediatamente, exibindo qual foi o erro encontrado e em qual
linha. Isso ajuda muito a identificar casos extremos e evita que o seu
programa continue a execução em um estado inconsistente.

Como dizem os Klingons:

bIlujDI' yIchegh()Qo'; yIHegh()!
(it is better to die() than to return() in failure)


Mais detalhes sobre o problema e sobre o autodie =
http://perltraining.com.au/tips/2008-08-20.html

 Em fim segue o codigo: http://pastebin.com/KH2bAGWU


Eu faria ainda uma mudança imediata: remover as globais. Em vez de ter :

my %h = ();
my %m = ();

lá em cima, é melhor fazer, dentro da sua main:

my %h = hybrid();
my %m = miranda();

Isso compartimentaliza e isola as suas variáveis, que agora só estarão
definidas no bloco que de fato as utiliza. Se o seu programa crescer,
vc não vai precisar se preocupar com globais acumulando e facilitando
problemas de ação à distância.

 Desconcidere o seu modulo Data::Printer, usei ele para testar o hash e
 esqueci de tirar do codigo depois, XD. (Otimo modulo).


Que bom que gostou =)

[]s

-b
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


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

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 br...@rio.pm.org


Oi Aureliano,



acho que o que o Tiago quis dizer é o que deveria estar acontecendo

mas não está, e o que está acontecendo em vez disso?



Assumindo que não há problema na lógica e o que está tentando resolver

são os warnings que colou no final do paste, a resposta está na

recomendação número 5 abaixo.



Agora, algumas dicas gerais sobre o código que você colou:



1) a solução canônica para manipulação de listas são os módulos

List::Util, List::MoreUtils e List::AllUtils (que agrega as funções de

ambos). No List::MoreUtils (e, consequentemente, no List::AllUtils) há

a função uniq() que faz o mesmo que o Array::Uniq. Então, a menos que

você tenha um excelente motivo para usar o Array::Uniq, recomendo

trocar para o List::MoreUtils.





2) Evite open() com apenas dois argumentos. Evite open() com barewords

em vez de variáveis. Por mais que você saiba o que está fazendo,

procure sempre manter a sintaxe:



open my $fh, '', $nome_do_arquivo

   or die erro