Pregunta

¿Es una buena idea citar claves cuando se utiliza un hash en Perl?

Estoy trabajando en una base de código Perl heredada extremadamente grande y estoy tratando de adoptar muchas de las mejores prácticas sugeridas por Damian Conway en Mejores prácticas de Perl . Sé que las mejores prácticas son siempre un tema delicado para los programadores, pero espero que pueda obtener algunas buenas respuestas en este tema sin iniciar una guerra de llamas. También sé que esto es probablemente algo que mucha gente no discutiría debido a que es un problema menor, pero estoy tratando de obtener una lista sólida de pautas a seguir a medida que avanzo este código base.

En el libro de Perl Best Practices de Damian Conway , hay un ejemplo que muestra cómo ayuda la alineación. legibilidad de una sección del código, pero no menciona (en ninguna parte del libro que pueda encontrar) nada sobre la cita de las claves hash.

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

¿No sería mejor escribir esto con citas para enfatizar que no estás usando palabras simples?

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

Solución

Al especificar claves hash de cadena constante, siempre debe usar comillas (simples). Por ejemplo, $ hash {'key'} Esta es la mejor opción porque evita la necesidad de pensar en este problema y da como resultado un formato consistente. Si deja de lado las comillas a veces, debe recordar agregarlas cuando su clave contenga palabras internas, espacios u otros caracteres especiales. Usted debe usar comillas en esos casos, lo que lleva a un formato inconsistente (a veces sin comillas, a veces citado). Las claves entre comillas también tienen más probabilidades de ser resaltadas por la sintaxis de su editor.

Aquí hay un ejemplo donde se usa el " citado a veces, no citado en otras ocasiones " la convención puede meterte en problemas:

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

Eso se compilará bien bajo use strict , pero no hará lo que se espera en el tiempo de ejecución. Las claves de hash son cadenas. Las cadenas deben citarse según sea apropiado para su contenido: comillas simples para cadenas literales, comillas dobles para permitir la interpolación de variables. Cita tus claves hash. Es la convención más segura y la más sencilla de entender y seguir.

Otros consejos

Sin comillas es mejor. Está en {}, por lo que es obvio que no está usando palabras peladas, y además es más fácil de leer y escribir (dos símbolos menos). Pero todo esto depende del programador, por supuesto.

Nunca cito solo las claves hash. Sé que {} básicamente funciona como comillas, excepto en casos especiales (a + y comillas dobles). Mi editor también lo sabe, y me da algunas pistas basadas en el color para asegurarme de que hice lo que pretendía.

El uso de comillas simples en todas partes me parece un " defensivo " Práctica perpetrada por personas que no conocen a Perl. Ahorra algo de desgaste del teclado y aprende Perl :)

Con el comentario al margen, la verdadera razón por la que estoy publicando este comentario ... los otros comentarios parecen haber pasado por alto el hecho de que + se " unquote; quot " una sola palabra Eso significa que puedes escribir:

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

o:

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

Así que está bastante claro que + shift significa "llamar a la función de cambio" y shift significa " la cadena 'shift' " ;.

También señalaré que el modo cperl resalta todos los casos correctamente. Si no es así, hazme un ping en IRC y lo arreglaré :)

(Ah, y una cosa más. Cito los nombres de los atributos en Moose, ya que en tiene 'foo' = > ... . Este es un hábito que aprendí de trabajar con stevan , y aunque creo que se ve bien ... es un poco inconsistente con el resto de mi código. Tal vez deje de hacerlo pronto.

Larry Wall prestó atención de nivel de sintaxis a las claves hash de Quoteless para asegurarse de que no habría ninguna razón para que no fueran las mejores prácticas. No te preocupes por las citas.

(Por cierto, las citas en las claves de matriz son la mejor práctica en PHP, y puede haber graves consecuencias por no usarlas, por no mencionar toneladas de E_WARNINGs. ¡Bien en Perl! = bien en PHP .)

No creo que haya una mejor práctica en este caso. Personalmente los uso en claves hash así:

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

pero no los use a la izquierda del operador de flecha:

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

No me preguntes por qué, es solo la forma en que lo hago :)

Creo que lo más importante que puedes hacer es siempre, siempre, siempre:

use strict;
use warnings; 

De esa manera, el compilador detectará cualquier error semántico para ti, lo que hará que tengas menos posibilidades de escribir mal algo, sin importar de qué manera decidas ir.

Y lo segundo más importante es ser consistente.

Voy sin comillas, solo porque es menos para escribir, leer y preocuparse. Los tiempos en los que tengo una clave que no se citará automáticamente son pocos y no están a la altura de todo el trabajo y el desorden. Tal vez mi elección de teclas hash haya cambiado para adaptarse a mi estilo, lo cual es igual de bueno. Evita los casos de borde por completo.

Es más o menos la misma razón por la que uso " de forma predeterminada. Es más común para mí colocar una variable en medio de una cadena que usar un carácter que no quiero interpolar. Es decir, he escrito más a menudo 'Hola, mi nombre es $ name' que " Me debes $ 1000 " .

Al menos, las citas impiden que la sintaxis resalte las palabras reservadas en editores no tan perfectos. Echa un vistazo a:

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

Prefiero ir sin comillas, a menos que quiera interpolación de cadenas. Y luego uso comillas dobles. Lo comparo con números literales. Perl realmente te permitiría hacer lo siguiente:

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

Pero nadie hace eso. Y no ayuda con claridad, simplemente porque agregamos dos caracteres más para escribir. Al igual que a veces queremos específicamente la ranura # 3 en una matriz, a veces queremos que la entrada PATH salga de % ENV . De una sola vez, agregue claridad no en lo que a mí respecta.

La forma en que Perl analiza el código hace que sea imposible utilizar otros tipos de " palabras desnudas " en un índice hash.

Probar

$myhash{shift}

y solo vas a obtener el elemento almacenado en el hash bajo la tecla 'shift' , debes hacer esto

$myhash{shift()}

para especificar que desea que el primer argumento indexe su hash.

Además, uso jEdit , el editor visual SOLAMENTE (que yo ' He visto (además de emacs) que le permite a usted el control total sobre el resaltado. Así que es doblemente claro para mí. Cualquier cosa que se parezca a la anterior recibe KEYWORD3 ($ myhash) + SYMBOL ({) + LITERAL2 (shift) + SYMBOL (}) si hay paréntesis antes del cierre, obtiene KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL (())). Además, es probable que también lo formatee así:

$myhash{ shift() }

Ve con las comillas! Rompen visualmente la sintaxis y más editores los apoyarán en el resaltado de sintaxis (hey, incluso Stack Overflow está resaltando la versión de comillas). También argumentaría que notaría errores tipográficos más rápidos si los editores verificaban que había finalizado su cotización.

Es mejor con comillas porque le permite usar caracteres especiales no permitidos en palabras simples. Al usar comillas, puedo usar los caracteres especiales de mi lengua materna en las teclas hash.

Puede preceder la clave con un " - " (menos el carácter) también, pero tenga en cuenta que esto agrega el " - " al principio de su clave. De algunos de mis códigos:

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

También utilizo la comilla simple, la comilla doble y la forma quoteless. Todo en el mismo programa :-)

Yo mismo me lo he preguntado, especialmente cuando descubrí que he cometido algunos errores:

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

Lo que tiendo a hacer ahora es aplicar citas universalmente en función de hash si al menos una de las claves literales las necesita; y usa paréntesis con constantes:

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

Siempre los he usado sin comillas, pero me gustaría repetir el uso de estrictos y advertencias, ya que detectan la mayoría de los errores comunes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top