NOME
perlstyle - Guia de Estilos de Perl
DESCRIÇÃO
Cada programador terá, naturalmente, suas próprias preferências quanto à formatação de código, mas existem algumas normas que tornarão seus programas mais fáceis de serem lidos, entendidos e mantidos.
O mais importante é executar seus programas usando sempre a flag -w. Você pode desativá-la explicitamente em trechos de código usando o pragma no warnings
ou através da variável $^W
se desejar. Você deve sempre executar seu código usando o pragma use strict
ou saber a razão para não fazê-lo. Os pragmas use sigtrap
e use diagnostics
podem também ser úteis.
Em relação à estética do código, a única coisa com a qual o Larry realmente se importa é que o fecha-chaves de um BLOCO com mais de uma linha esteja alinhado com o comando que deu início ao bloco. Fora isso, ele tem outras preferências não tão rígidas:
Identação em 4 colunas.
Abra chaves na mesma linha do comando, se possível. Senão, alinhe-a.
Dê espaco antes de abrir chaves em um bloco com mais de uma linha.
Blocos de uma linha podem ser colocados em uma única linha, incluindo abre-chaves e fecha-chaves.
Nenhum espaço antes do ponto-e-vírgula.
Omita ponto-e-vírgula em blocos pequenos de uma linha.
Coloque espaços antes e depois da maioria dos operadores.
Coloque espaços antes e depois de índices complexos (dentro de colchetes).
Coloque linhas em branco entre pedaços de código que façam coisas diferentes.
Coloque o else na linha abaixo do fecha-chaves do if.
Exemplo:
if (...) { ... } else { ... }
Não use espaços entre o nome de uma função e o parêntese.
Espaços depois de cada vírgula.
Quebre linhas muito longas depois de um operador (exceto "and" e "or").
Espacos depois do último parêntese fechado na mesma linha.
Alinhe verticalmente os items correspondentes.
Omita pontuação redundante desde que não afete a clareza do código.
Larry tem seus motivos para cada uma destas normas, mas não pede que todos trabalhem da mesma forma que ele.
Abaixo encontram-se algumas outras questões sobre estilos a serem considerados:
Só porque eu POSSO fazer algo de um modo em particular não quer dizer que eu DEVA fazê-lo dessa forma. Perl foi projetado para te deixar fazer tudo de muitas maneiras diferentes, então considere escolher a mais legível delas. Por exemplo
open(FOO, $foo) || die "Erro ao abrir $foo: $!";
é melhor que
die "Erro ao abrir $foo: $!" unless open(FOO, $foo);
porque a segunda forma esconde o objetivo da declaração em um modificador. Por outro lado
print "Iniciando análise\n" if $verbose;
é melhor que
$verbose && print "Iniciando análise\n";
porque a questão principal não é se o usuário digitou -v ou não.
Similarmente, só porque um operador permite que você assuma argumentos padrão não quer dizer que voce tenha que usar tais padrões. Os argumentos padrão estão lá para programadores preguiçosos de sistemas escrevendo soluções rápidas que serão executadas somente uma vez. Se você quer que seu programa seja legível, considere fornecer explicitamente os argumentos.
Dentro dessa mesma linha, só porque você PODE omitir parênteses em muitos lugares não que dizer que você deva:
return print reverse sort num values %array; return print(reverse(sort num (values(%array))));
Quando em dúvida, coloque parênteses. No mínimo irá permitir que as pessoas brinquem com a tecla % no vi.
Mesmo que não tenha dúvidas, considere a saúde mental da pessoa que irá manter seu código depois de você, e que provavelmente colocará os parênteses no lugar errado.
Não faça contorcionismos para sair de um loop no seu início ou final, quando o Perl possui o operador
last
para que você possa sair no meio do mesmo. Tire um pouco da identação se quiser deixá-lo mais visível:LINE: for (;;) { statements; last LINE if $foo; next LINE if /^#/; statements; }
Não tenha medo de usar rótulos em laços (loops) -- eles existem para aumentar a legibilidade assim como para permitir vários níveis de saída de laços. Veja o exemplo anterior.
Evite usar
grep()
(oumap()
) ou `backticks` em contexto vazio (void), isto é, quando você descarta o valor de retorno. Todas estas funções possuem valores de retorno, então use-os. Do contrario, use um laçoforeach()
ou a funçãosystem()
.Por questão de portabilidade, quando usar funcionalidades que podem não estar implementadas em todos os sistemas, teste a construção em um
eval
para verificar se existe falha. Se souber a versão ou patchlevel em que uma funcionalidade foi implementada, você pode testar a variável especial$]
($PERL_VERSION
se usar o pragmaEnglish
) para saber a funcionalidade estará lá. O móduloConfig
também permite a verificação de valores determinados pelo programa Configure quando o Perl foi instalado.Escolha identificadores claros. Se você não sabe o que claro significa, você tem um problema.
Enquanto identificadores curtos como
$gotit
provavelmente servem, use o caractere de sublinhado para separar palavras em identificadores mais longos. Costuma ser mais fácil ler$nomes_de_variaveis_assim
do que$NomesDeVariaveisAssim
, especialmente para pessoas que não falam nativamente o idioma em que o identificador foi escrito. Também trata-se de uma regra simples e que funciona consistentemente paraNOMES_DE_VARIAVEIS_ASSIM
.Nomes de pacotes são uma exceção a essa regra. Perl informalmente reserva nomes com letras minúsculas para módulos "pragma" como
integer
estrict
. Outros módulos devem iniciar seu nome com letra maiúscula e misturar maiúsculas e minúsculas, mas provavelmente sem sublinhados devido à limitações impostas pela representação dos nomes de modulos como arquivos em apenas alguns bytes em sistemas de arquivos primitivos.Você pode achar útil usar maiúsculas e minúsculas para indicar o escopo ou natureza de uma variável. Por exemplo:
$LETRAS_MAISCULAS_AQUI somente constantes (cuidado para não colidir com variaveis do Perl!) $Algumas_Maiusculas_Aqui globais/estáticas em seu pacote $sem_maiusculas_aqui variáveis C<my()> ou C<local()> de escopo de funções
Nomes de funções ou métodos parecem visualmente melhores se completamente em letras minúsculas. Ex: $obj->as_string().
Você pode começar identificadores de variáveis e funções com um caractere de sublinhado para indicar que ela não deve ser usada fora do pacote onde foi definida.
Se você tiver uma expressão regular cabeluda, use o modificador
/x
e ponha alguns espaços em branco para melhorar sua legibilidade. Não use "/" ou "\" como delimitadores quando sua expressão regular tiver "/" ou "\" ela própria.Utilize os operadores
and
eor
para evitar colocar muitos parênteses em operadores de listas e reduzir a incidência de operadores de pontuação como&&
e||
. Chame suas subrotinas como se fossem funções ou operadores de lista para evitar o excesso de "&" e parênteses.Use here documents em vez de vários print() seguidos.
Alinhe elementos correspondentes verticalmente, especialmente se for longo demais para caber em uma única linha.
$IDX = $ST_MTIME; $IDX = $ST_ATIME if $opt_u; $IDX = $ST_CTIME if $opt_c; $IDX = $ST_SIZE if $opt_s; mkdir $tmpdir, 0700 or die "can't mkdir $tmpdir: $!"; chdir($tmpdir) or die "can't chdir $tmpdir: $!"; mkdir 'tmp', 0777 or die "can't mkdir $tmpdir/tmp: $!";
Sempre verifique o valor de retorno de uma chamada ao sistema (system call). Boas mensagens de erro devem ir para o
STDERR
, incluir o programa que causou o problema, qual chamada ao sistema e com quais argumentos, e (MUITO IMPORTANTE) deve conter a mensagem padrão do sistema para o que deu errado. Aqui apresentamos um exemplo simples mas suficiente:opendir(D, $dir) or die "can't opendir $dir: $!";
Alinhe suas transliterações sempre que isso fizer sentido.
tr [abc] [xyz];
Pense em reusabilidade. Por que desperdiçar massa cinzenta em um código pra ser executado apenas uma vez quando você pode precisar fazer assim no futuro? Considere generalizar seu código. Considere escrever um módulo ou classe de objetos. Considere em fazer com que seu código execute limpo com
use strict
e <use warnings> (ou -w) ativos. Considere distribuir seu código. Considere mudar o modo como vê o mundo. Considere... ah, deixa pra lá.Procure documentar seu código e usar a formatação Pod de forma consistente. Aqui estão algumas convenções esperadas:
use
C<>
para nomes de funções, variáveis ou módulos (and de forma mais geral qualquer coisa que possa ser considerada parte de código, como handles de arquivos ou valores específicos). Note que nomes de funções costumam ser mais legíveis com parênteses após o nome, isto é,funcao()
.use
B<>
para nomes de comandos como cat ou grep.use
F<>
orC<>
para nomes de arquivos.F<>
deverá ser o único código Pod para nomes de arquivos, mas como muitos formatadores de Pod renderizam como itálico, caminhos de diretórios com "/" e "\" podem ficar menos legíveis, e renderizam melhor comC<>
.
Seja consistente.
Seja uma pessoa boa.
TRADUÇÃO
João Ribeiro da Silva
Breno G. de Oliveira