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 <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
_______________________________________________ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm