r6 - 22 Aug 2010 - BrenoOliveira
NOME
perlstyle - Guia de Estilos de PerlDESCRIÇÃ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 pragmano 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 {
...
}
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.
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;
}
grep() (ou map()) 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ço foreach() ou a função system().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 pragma English) para saber a funcionalidade estará lá. O módulo Config também permite a verificação de valores determinados pelo programa Configure quando o Perl foi instalado.$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 para NOMES_DE_VARIAVEIS_ASSIM.integer e strict. 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.
$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 Variavies 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.
/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.and e or 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.print() seguidos.
$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: $!";
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: $!";
tr [abc]
[xyz];
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á.- 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<>.

