# $Id$ =head1 NOME O Guia do brian para Resolver Qualquer Problema em Perl =head1 SINOPSE Segue este guia e salva a tua sanidade mental =head1 DESCRIÇÃO =head2 A minha Filosofia na Depuração Acredito em três coisas: =over 4 =item Não é nada de pessoal! Esquece tudo sobre quem escreveu o código. Podes pensar que és uma estrela, mas até os grandes Mestres produzem uma grande quantidade de porcaria. O código de toda a gente é uma porcaria, o que significa que o meu código é uma porcaria, e o teu código é uma porcaria. Aprende a gostar disso. Quando tiveres algum problema, o teu primeiro pensamento deve ser "Está qualquer coisa errada com a minha porcaria de código". Isto significa que não vais culpar o perl. Não é nada de pessoal. Esquece como é que B fazes as coisas. Se a forma como fizeste as coisas funcionou, então não estarias a ler isto. Mas isso não é uma coisa má. É a altura para evoluir. Todos nós já estivemos nessa situação. =item Responsabilidade pessoal. Se tens um problema com um programa que escreveste, é apenas isso: um problema teu. Deves tentar fazer o máximo que puderes, por ti, para o tentar resolver. Lembra-te que toda a gente tem os seus próprios programas e, portanto, terá os seus próprios problemas. Faz o teu trabalho de casa, e dá o teu melhor antes de aborreceres alguém com os teus problemas. Se tentaste mesmo tudo neste guia, e ainda não conseguiste resolver o teu problema, então deste o teu melhor e está na altura de chatear alguém. =item Muda o modo como fazes as coisas Corrige as coisas de forma a que não tenhas o mesmo problema de novo. O problema é, provavelmente, a B como escreves o teu código, e não B tentas resolver. Muda a forma como fazes as coisas, e torna a tua vida mais simples. Não faças com que o Perl se adapte a ti, porque ele não o fará. Adapta-te ao Perl. É apenas uma linguagem, não uma forma de vida. =back =head2 O Meu Método =over 4 =item O teu programa compila com restricções? Se ainda não estás a usar restricções, é a altura de as ligar. Os gurus em Perl são gurus porque eles usam restricções que lhes deixam mais tempo para resolver outros problemas, aprender coisas novas, e disponibilizar módulos funcionais no CPAN. Podes ligar as rescrições no teu código com o I. use strict; Também podes ligar estas restrições na linha de comando usando o I. perl -Mstrict script.pl Podes ficar chateado com tantas restricções, mas depois de um par de semanas a programar com elas, escreverás código melhor, gastarás menos tempo à procura de erros simples, e provavelmente não precisarás deste guia. =item Qual é o aviso? O Perl vai-te avisar sobre um grande conjunto de construcções questionáveis. Liga os avisos (I) e ajuda o Perl a ajudar-te. Podes usar o I do perl dentro de um programa: #!/usr/bin/perl -w Podes usá-lo da mesmo forma na linha de comando: perl -w script.pl Podes usar avisos locais para um grande conjunto de coisas interessantes. Vê a documentação L para mais detalhes. use warnings; Se não percebes um aviso, podes procurar uma versão explicada do aviso na documentação L, ou podes usar o I no teu código: use diagnostics; =item Resolve o primeiro problema, primeiro! Depois de o perl te der dado um erro ou um aviso, resolve a primeira mensagem, e vê se o perl continua a queixar-se. Essas mensagens extra podem ser resultado do primeiro problema. =item Olha para o código na linha antes da indicada na mensagem de erro! O perl dá-te mensagens de aviso quando se preocupa, e nunca antes. Na altura em que o perl se preocupou é provável que o problema já tenha acontecido, e a linha em que o perl está esteja, na verdade, seja B do problema. Procura num par de expressões antes da linha indicada na mensagem. =item Será o valor que pensas que é? Não adivinhes! Examina o valor de tudo precisamente antes de o usares numa expressão. O melhor depurador no universo é o print. print STDERR "O valor é [$value]\n"; Coloquei a variável C<$value> entre parentesis rectos para ter a certeza de que não existem espaços ou mudanças de linha extra. Se tenho alguma coisa na variável que não é um escalar, então uso o Data::Dumper para imprimir a estrutura de dados. require Data::Dumper; print STDERR "Na hash tenho ", Data::Dumper::Dumper( %hash ), "\n"; Se o valor não é aquele que pensavas que era, então verifica alguns dos passos anteriores, e tenta de novo! Faz isto até que encontres o ponto do código em que o valor deixa de ser aquilo que esperavas que fosse! Também podes usar o depurador do perl, usando o I. Vê a documentação L para mais detalhes. perl -d script.pl Também podes usar outros depuradores, ou ambientes de desenvolvimento, como o ptkdb (um depurador gráfico baseado em Tk) ou o Komodo (um IDE da ActiveState baseado no gecko da Mozilla). =item Estás a usar as funções da forma correcta? Programo Perl há muito tempo, e ainda consulto a L quase todos os dias. Há algumas coisas que eu não consigo decorar, e por vezes, estou com tanto sono que quase perco todos os meus sentidos, e fico a matutar porque raio o C nao imprime para o ecrã. Podes procurar por uma função em particular na documentação com o comando C e o seu I: perldoc -f function_name Se estás a usar um módulo, verifica a documentação para teres a certeza que o estás a usar da forma correcta. Podes consultar a documentação para um módulo específico usando o perldoc: perldoc Module::Name =item Estás a usar a variável especial correcta? Mais uma vez, costumo consultar com regularidade o L. Bem, na verdade nem tanto, já que o I é muito mais fácil de usar. =item Estás a usar a versão certa do módulo? Alguns módulos mudam o seu comportamento entre diferentes versões. Estás a usar a versão do módulo que pensas que tens? Podes verificar a versão de quase todos os módulos com uma simples linha de perl: perl -MModule::Name -le 'print Module::Name->VERSION'; Se normalmente lês a documentação fora da tua máquina local, como por exemplo em http://www.perldoc.com ou http://search.cpan.org, então é mais provável estares a ler a documentação de uma versão diferente do módulo. =item Fizeste um pequeno programa de teste? Se estás a tentar alguma coisa nova, ou pensas que determinada porção de código está a comportar-se de forma estranha, escreve o mais pequeno programa que conseguires que use essa porção de código. Isto deverá remover todos os outros factores de consideração. Se o pequeno teste fizer o que esperavas, então o problema provavelmente não é desse código. Se, por outro lado, o programa não faz aquilo que esperavas, então deves ter encontrado o teu problema. =item Verificaste o ambiente? Algumas coisas dependem das variáveis de ambiente. Tens a certeza de que estão definidas com os valores correctos? O teu ambiente é o mesmo em que o programa irá ser executado? Lembra-te que os programas desenhados para serem executados como CGI ou I podem ver ambientes diferentes daqueles que tu tens, especialmente se executarem em máquinas diferentes. O perl guarda o ambiente em C<%ENV>. Se precisas de usar uma dessas variáveis, prepara-te para lhe dar um valor por omissão se ela não existir, mesmo que só para testar. Se ainda tens problemas, verifica as variáveis de ambiente: require Data::Dumper; print STDERR Data::Dumper::Dumper( \%ENV ); =item Já procuraste no Google? Se tens um problema, já alguém teve esse mesmo problema. Procura se alguma outra pessoa já discutiu esse erro no grupo da usenet comp.lang.perl.misc, procurando no Google Groups (http://groups.google.com). A diferença entre as pessoas que fazem perguntas no usenet, e aquelas que as respondem, é conseguirem usar efectivamente o Google Groups. =item Já traçaste um perfil? Se queres encontrar as partes lentas do teu programa, já traçaste um perfil? Deixa que o Devel::SmallProf faça esse trabalho por ti. Ele conta o número de vezes que o perl executa determinada linha de código bem como quanto tempo ela demorou, e imprime um relatório. =item Qual é o teste que falha? Se tens um conjunto de testes, qual é o teste que falha? Deves ser capaz de encontrar o erro muito depressa, já que cada teste deve verificar apenas um bocado do código. Se não tens um conjunto de testes, porque não criar uma? Se tens um programa realmente pequeno, ou é um programa descartável, então não te vou obrigar a escrever um par de testes. Mas qualquer outra situação irá beneficiar de um conjunto de testes. O Test::Harness torna isto tão simples que não tens qualquer desculpa para o não fazeres. Se não tens tempo para isso, possivelmente é porque estás a gastar demasiado tempo a depurar os teus programas sem usar testes. Afinal de contas, o MakeMaker não é apenas para módulos. =item Já falaste com o urso? Explica o teu problema em voz alta. Sim, diz mesmo as palavras. Durante um par de anos tive o prazer de trabalhar com um programador muito bom, que conseguia resolver quase qualquer coisa. Quando encontrava um problema, ia ter com ele e começava a explicar o meu problema. Habitualmente não chegava à terceira frase sem dizer "Esquece-- já descobri." Uma vez que vais ter que fazer isto tantas vezes, recomendo qualquer tipo de brinquedo de peluche que funcione como o teu terapeuta Perl, para assim não aborreceres os teus colegas. Eu tenho um ursinho sentado na minha secretária, e explico-lhe os meus problemas. Agora, a minha namorada já nem liga quando começo a falar comigo mesmo. =item Será que o problema é diferente no papel? Tens estado a olhar para o ecrã do computador, portanto, usar outro tipo de média pode ajudar a ver as coisas de uma nova perspectiva. Tenta olhar para uma impressão do teu programa. =item Já viste o The Daily Show com Jon Stewart? A sério. É provável que não gostes do Jon Stewart, mas então, escolhe outra coisa qualquer. Faz um intervalo. Pára de pensar no assunto por algum tempo, e deixa a tua mente relaxar. Volta mais tarde, e a solução pode ficar visível imediatamente. =item Já encaixotaste o teu ego? Se ainda não resolveste o teu problema, pode ser que seja psicológico. Podes estar agarrado emocionalmente a determinadas porções do código, de tal modo que te recusas a alterá-lo. Também é provável que penses que toda a gente está errada, menos tu. Quando o fazes, não estás a considerar a fonte mais provável de erros: tu. Nao ignores nada. Verifica tudo! =head1 AUTOR brian d foy, Ebdfoy@cpan.orgE =head1 TRADUTOR Alberto Simões, Eambs@cpan.orgE =head1 COPYRIGHT Copyright 2002, Perl Documentation Project, All Rights Reserved =cut