<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Opa, obrigado mesmo, de nada adianta pedir ajuda e a pessoa resolver o problema para você, é melhor que a pessoa indique o caminho certo, <br>assim você aprende a fazer.<br><br>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.<br><br>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...<br>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.<br>E estou aprendendo muita coisa com isso.<br><br>Se não for ser muito chato, como faço para seguir a forma abaixo:<br><br>> 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem<br>> modificar $/) e ir acumulando as linhas até encontrar um símbolo que<br>> indique nova entrada.<br><br>seria algo do tipo:<br><br>while (<$fh>){<br>if(/primeira linha/){<br>print $_;<br>}<br>elsif (/ultima linha/){<br>#sair do loop<br>}<br>else {<br>print $_<br>}<br>}<br><br><div><div id="SkyDrivePlaceholder"></div>> Date: Sat, 24 Nov 2012 00:34:43 -0200<br>> From: breno@rio.pm.org<br>> To: rio-pm@pm.org<br>> Subject: Re: [Rio-pm] Comparação de arquivos<br>> <br>> 2012/11/23 Aureliano Guedes <guedes_1000@hotmail.com>:<br>> > Breno, valeu mesmo por mais dicas preciosas, dessa ultima forma que me falou<br>> > foi bem mais facil codar. A logica foi super-simples mas não fui capaz de<br>> > pensar nisso sozinho.<br>> ><br>> > Mais ainda estou com um problema e uma duvida.<br>> ><br>> > - devido o $/ o print não esta saindo completo, vem faltando parte do<br>> > documento, justamente o valor de $/. Como resolver isso?<br>> ><br>> <br>> Várias formas diferentes. Seguem duas de exemplo:<br>> <br>> 1) concatenar $/ ao final da sua string na hora de atribuir;<br>> 2) trocar de abordagem, fazendo seu parser ler linha a linha (sem<br>> modificar $/) e ir acumulando as linhas até encontrar um símbolo que<br>> indique nova entrada. Eu prefiro essa abordagem pq facilita (pra mim)<br>> a compreensão e ajuda (para todos) a alteração/extensão futura do seu<br>> parser, caso vc queira em algum momento separar os valores de cada<br>> registro em subgrupos, por exemplo.<br>> <br>> Note ainda que, se for possivel interagir com os dados dos programas<br>> internos mais diretamente (por exemplo, através de wrappers de alguma<br>> API) em vez de analisando essa saída, você provavelmente conseguirá<br>> mais flexibilidade na leitura e interpretação dos dados de saida.<br>> <br>> > - Não entendo o que você quer dizer com "testar o valor de retorno de<br>> > funções como open()"?<br>> ><br>> <br>> Funções que acessam o sistema de arquivos tem uma propensão muito<br>> maior em falhar, por motivos como muitos arquivos abertos, erro de<br>> disco, arquivo não encontrado, só pra citar alguns. Digamos, por<br>> exemplo, que você faça:<br>> <br>>   open my $fh, '<', 'miranda.txt';<br>>   while (my $linha = <$fh>) {<br>>      print $linha;<br>>   }<br>>   close $fh;<br>> <br>> E se vc rodar o programa de um diretório errado e, por isso, ele não<br>> achar o 'miranda.txt'? Você não vai receber nenhuma resposta (porque<br>> está ignorando o valor de retorno da open()), seu programa vai<br>> continuar rodando como se nada tivesse acontecido, e operações com o<br>> handle vão falhar silenciosamente. Por isso escrevemos:<br>> <br>>   open my $fh, '<', 'miranda.txt' or die $!;<br>> <br>> o "or die" testa o valor de retorno da função open(). Se open() falhou<br>> ao abrir o arquivo, ela retorna undef e registra o erro na variável<br>> especial $!. O que o "or die" está fazendo é: "rode o open() ou, se o<br>> open() falhar, morra exibindo a mensagem em $!". Entendeu?<br>> <br>> A maioria das pessoas bota o "or die" pelo menos depois de um open(),<br>> mas a verdade é que várias outras funções podem falhar sem vc ficar<br>> sabendo. Por isso o ideal é vc testar o valor de retorno de todas as<br>> funções, em especial as que envolvem I/O. Mas convenhamos, isso é<br>> chatíssimo. Já pensou fazer "print $fh q{lalala} or die 'erro<br>> escrevendo em arquivo'" cada vez que for fazer um print? Quando vc usa<br>> o pragma autodie, ele muda essas funções para que elas gerem excessões<br>> fatais caso falhem, de modo que tudo que vc precisa fazer é escrever:<br>> <br>>    use autodie;<br>> <br>> no início do seu programa e não se preocupar mais. A partir daí, não<br>> precisa botar "or die" nenhum. Sempre que a função falhar (seja<br>> open(), close(), print() e várias outras) ela vai gerar uma exceção<br>> fatal imediatamente, exibindo qual foi o erro encontrado e em qual<br>> linha. Isso ajuda muito a identificar casos extremos e evita que o seu<br>> programa continue a execução em um estado inconsistente.<br>> <br>> Como dizem os Klingons:<br>> <br>> bIlujDI' yIchegh()Qo'; yIHegh()!<br>> (it is better to die() than to return() in failure)<br>> <br>> <br>> Mais detalhes sobre o problema e sobre o autodie =><br>> http://perltraining.com.au/tips/2008-08-20.html<br>> <br>> > Em fim segue o codigo: http://pastebin.com/KH2bAGWU<br>> ><br>> <br>> Eu faria ainda uma mudança imediata: remover as globais. Em vez de ter :<br>> <br>> my %h = ();<br>> my %m = ();<br>> <br>> lá em cima, é melhor fazer, dentro da sua main:<br>> <br>> my %h = hybrid();<br>> my %m = miranda();<br>> <br>> Isso compartimentaliza e isola as suas variáveis, que agora só estarão<br>> definidas no bloco que de fato as utiliza. Se o seu programa crescer,<br>> vc não vai precisar se preocupar com globais acumulando e facilitando<br>> problemas de ação à distância.<br>> <br>> > Desconcidere o seu modulo Data::Printer, usei ele para testar o hash e<br>> > esqueci de tirar do codigo depois, XD. (Otimo modulo).<br>> ><br>> <br>> Que bom que gostou =)<br>> <br>> []s<br>> <br>> -b<br>> _______________________________________________<br>> Rio-pm mailing list<br>> Rio-pm@pm.org<br>> http://mail.pm.org/mailman/listinfo/rio-pm<br></div>                                    </div></body>
</html>