Pergunta

É uma boa idéia para chaves citação ao usar um hash em Perl?

Eu estou trabalhando em um imenso legado base de código Perl e tentando adotar um monte das melhores práticas sugeridas por Damian Conway em Perl Best Practices . Eu sei que as melhores práticas são sempre um assunto delicado com os programadores, mas espero que eu possa obter algumas boas respostas em um presente sem iniciar uma guerra chama. Eu também sei que este é provavelmente algo que muita gente não discutiria mais devido ao facto de ser uma questão menor, mas eu estou tentando obter uma sólida lista de diretrizes a serem seguidas como eu trabalho meu caminho através desta base de código.

Na Perl Best Practices livro de Damian Conway , há este exemplo que mostra como o alinhamento ajuda legibilidade de uma seção do código, mas não menciona (em qualquer lugar no livro que eu possa encontrar) nada sobre citando as chaves de hash.

$ident{ name   } = standardize_name($name);
$ident{ age    } = time - $birth_date;
$ident{ status } = 'active';

ESTA NÃO SERIA melhor escrito com aspas para enfatizar que você não está usando palavras nuas?

$ident{ 'name'   } = standardize_name($name);
$ident{ 'age'    } = time - $birth_date;
$ident{ 'status' } = 'active';
Foi útil?

Solução

Ao especificar chaves seqüência de hash constante, você deve sempre usar aspas (simples). Por exemplo, $hash{'key'} esta é a melhor escolha, pois elimina a necessidade de pensar sobre esta questão e resulta em uma formatação consistente. Se você deixar de fora as citações às vezes, você tem que lembrar de adicioná-los quando sua chave contém hypens internas, espaços ou outros caracteres especiais. Você deve uso aspas nesses casos, levando a formatação inconsistente (às vezes sem aspas, às vezes citado). chaves citados são também mais propensos a estar ao seu editor com sintaxe destacada.

Aqui está um exemplo onde usando o "citadas outras vezes, por vezes, não são cotados" convenção pode trazer-lhe problemas:

$settings{unlink-devices} = 1; # I saved two characters!

Isso vai compilar muito bem sob use strict, mas não muito fazer o que você espera em tempo de execução. chaves de hash são strings. Cordas deve ser citado como apropriado para seu conteúdo: aspas simples para strings literais, aspas duplas para permitir a interpolação variável. Citar suas chaves de hash. É a convenção mais segura e mais simples de entender e seguir.

Outras dicas

Sem aspas é melhor. É no {} então é óbvio que você não está usando barewords, além de que é tanto mais fácil de ler e tipo (dois a menos símbolos). Mas tudo isso depende do programador, é claro.

Eu nunca chaves de hash-aspas simples. Eu sei que {} funciona basicamente como citações fazer, excepto em casos especiais (a + e aspas). Meu editor sabe disso também, e me dá algumas sugestões baseadas em cores para se certificar de que eu fiz o que eu pretendia.

Usando aspas simples em todos os lugares parece-me como uma prática "defensiva" perpetrado por pessoas que não sabem Perl. Poupar algum desgaste teclado e aprender Perl:)

Com a sair discurso do caminho, a verdadeira razão estou postando este comentário ... os outros comentários parecem ter perdido o fato de que + vai "fecha aspas" um bareword. Isso significa que você pode escrever:

sub foo {
    $hash{+shift} = 42;
}

ou

use constant foo => 'OH HAI';
$hash{+foo} = 'I AM A LOLCAT';

Por isso, é bastante claro que os meios +shift "chamar a função shift" e meios shift "a string 'mudança'".

Além disso, vou ressaltar que destaca de modo cperl todos os vários casos corretamente. Se isso não acontecer, pingue-me no IRC e eu vou corrigi-lo:)

(Oh, e mais uma coisa. Eu faço nomes de atributos citação em Moose, como em has 'foo' => .... Este é um hábito que eu peguei de trabalhar com Stevan, e embora eu acho que parece bom ... é um pouco inconsistente com o resto do meu código. Talvez eu vou parar de fazer isso em breve.)

chaves Quoteless de hash recebidos de nível sintaxe atenção de Larry Wall ter certeza de que não haveria nenhuma razão para que eles sejam diferente de melhores práticas. Não se preocupe com as aspas.

(Aliás, citações sobre chaves do array são melhores práticas em PHP, e pode haver consequências graves para deixar de usá-los, para não mencionar toneladas de E_WARNINGs. Ok em Perl! = Bem em PHP .)

Eu não acho que há uma melhor prática em um presente. Pessoalmente, eu usá-los em chaves de hash assim:

$ident{'name'} = standardize_name($name);

mas não usá-los para a esquerda do operador de seta:

$ident = {name => standardize_name($name)};

Não me pergunte por que, é apenas a maneira que eu fazê-lo:)

Eu acho que a coisa mais importante que você pode fazer é sempre, sempre, sempre:

use strict;
use warnings; 

Dessa forma, o compilador irá detectar quaisquer erros semânticos para você, deixando-o menos provável de mistype alguma coisa, do jeito que você decidir ir.

E a segunda coisa mais importante é ser consistente.

Eu vou sem aspas, só porque é menos para escrever e ler e preocupar. As vezes quando eu tenho uma chave que não será auto-cotados são poucos e distantes entre si de modo a não valer a pena todo o trabalho extra e desordem. Talvez a minha escolha de chaves de hash mudaram para encaixar meu estilo, que é tão bem. Evitar os casos de ponta inteiramente.

É uma espécie da mesma razão que eu uso " por padrão. É mais comum para mim plop uma variável no meio de uma corda do que usar um personagem que eu não quero interpolados. O que quer dizer, eu tenho mais frequentemente escrito 'Hello, my name is $name' que "You owe me $1000".

Pelo menos, citando sintaxe prevent destacando palavras reservadas em editores não tão perfeitos. Confira:

$i{keys} = $a;
$i{values} = [1,2];
...

Eu prefiro ir sem aspas, a menos que eu quero um pouco de interpolação string. E então eu usar aspas duplas. Eu comparo a números literais. Perl seria realmente permitir que você faça o seguinte:

$achoo['1']  = 'kleenex';
$achoo['14'] = 'hankies';

Mas ninguém faz isso. E isso não ajuda com clareza, simplesmente porque nós adicionamos mais dois caracteres para tipo. Assim como às vezes queremos especificamente fenda # 3 em uma matriz, às vezes queremos a entrada PATH fora do %ENV. Single-citando-adicionar não clareza, tanto quanto eu estou preocupado.

A forma Perl analisa código torna impossível usar outros tipos de "palavras vazias" em um índice hash.

Tente

$myhash{shift}

e você só está indo para obter o item armazenado no hash sob a chave 'shift', você tem que fazer isso

$myhash{shift()}

, a fim de especificar que você deseja que o primeiro argumento para indexar o seu hash.

Além disso, eu uso jEdit , o SOMENTE editor visual (que eu' vi - além emacs) que permite você o controle total sobre destacando. Portanto, é duplamente claro para mim. Qualquer coisa parecendo o antigo fica KEYWORD3 ($ myhash) + SYMBOL ({) + LITERAL2 (shift) + SYMBOL (}) se houver um parêntese antes do fechamento encaracolado fica KEYWORD3 + SÍMBOLO + KEYWORD1 + SYMBOL (()}). Além disso, eu provavelmente vai formatá-lo como este, bem como:

$myhash{ shift() }

Vá com as aspas! Eles visualmente quebrar a sintaxe e mais editores irá apoiá-los no destaque de sintaxe (hey, mesmo Stack Overflow está destacando a versão citação). Eu também diria que você iria notar erros de digitação mais rápido com editores verificando que você terminou sua cotação.

É melhor com aspas porque ele permite que você use caracteres especiais não permitidos em barewords. Ao usar citações que eu posso usar os caracteres especiais da minha língua materna em chaves de hash.

Você pode preceder a chave com um "-" (personagem menos) também, mas esteja ciente de que este acrescenta o "-" para o início de sua chave. De alguns dos meu código:

$args{-title} ||= "Intrig";

Eu uso o aspas simples, aspas duplas, e forma quoteless também. Tudo no mesmo programa: -)

Já se perguntou sobre isso mesmo, especialmente quando eu descobri que eu fiz alguns lapsos:

 use constant CONSTANT => 'something';
 ...
 my %hash = ()
 $hash{CONSTANT}          = 'whoops!';  # Not what I intended
 $hash{word-with-hyphens} = 'whoops!';  # wrong again 

O que eu tendem a fazer agora é aplicar citações universalmente em uma base per-Hash se pelo menos uma das chaves literais precisa deles; e usar parênteses com constantes:

 $hash{CONSTANT()} = 'ugly, but what can you do?';

Eu sempre usei-los sem aspas, mas gostaria de repetir o uso de rigorosa e advertências como eles escolher a maioria dos erros comuns.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top