perl hash quotes

¿Las citas sobre las teclas hash son una buena práctica en Perl?



quotes (13)

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

Aquí hay un ejemplo en el que el uso de la convención "citado a veces, no citado otras veces" puede ocasionarle problemas:

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

Eso compilará muy bien bajo use strict , pero no hará exactamente lo que esperas en tiempo de ejecución. Las teclas hash son cadenas. Las cadenas deben citarse según corresponda a su contenido: comillas simples para cadenas literales, comillas dobles para permitir la interpolación variable. Cita tus claves hash. Es la convención más segura y la más simple de entender y seguir.

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

Estoy trabajando en una base de códigos Perl heredada extremadamente grande y estoy intentando adoptar muchas de las mejores prácticas sugeridas por Damian Conway en Perl Best Practices . Sé que las mejores prácticas son siempre un tema delicado para los programadores, pero espero poder obtener algunas buenas respuestas sobre este sin iniciar una guerra de llama. También sé que esto es probablemente algo sobre lo 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 avance en esta base de código.

En el libro Perl Best Practices de Damian Conway , hay un ejemplo que muestra cómo la alineación ayuda a la legibilidad de una sección de código, pero no menciona (en ningún lugar del libro que puedo encontrar) nada acerca de citar las teclas hash.

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

¿No sería mejor escribirlo con comillas para enfatizar que no estás usando palabras simples?

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


Al menos, las citas impiden que la sintaxis resalte las palabras reservadas en editores no tan perfectos. Revisa:

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


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


Ir con las comillas! Visualmente rompen la sintaxis y más editores los apoyarán en el resaltado de sintaxis (hey, incluso resalta la versión de la cita). También argumentaría que notaría los errores de escritura más rápidamente con los editores verificando que finalizó su cita.


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

(Por cierto, las comillas en las teclas de matriz son las mejores prácticas en PHP, y puede haber serias consecuencias al no poder usarlas, sin mencionar un montón de E_WARNINGs. Bien en Perl! = Bien en PHP.)


Me he preguntado sobre esto yo mismo, especialmente cuando descubrí que hice algunas fallas:

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 presupuestos universalmente en base a hash si al menos una de las claves literales los necesita; y use paréntesis con constantes:

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


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 esta forma, el compilador detectará cualquier error semántico para usted, lo que le impedirá confundir algo, cualquiera sea el camino que elija.

Y lo segundo más importante es ser consecuente.


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

Usar comillas simples en todas partes me parece una práctica "defensiva" perpetrada por personas que no conocen a Perl. Ahorre algo de desgaste del teclado y aprenda Perl :)

Con las diatribas fuera del camino, la verdadera razón por la que estoy publicando este comentario ... los otros comentarios parecen haber pasado por alto el hecho de que + "desmarcarán" una 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 correctamente todos los casos. Si no lo hace, hazme ping en el IRC y lo arreglaré :)

(Ah, y una cosa más. Cito nombres de atributos en Moose, como en has ''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).


Prefiero ir sin comillas, a menos que quiera una interpolación de cadenas. Y luego uso comillas dobles. Lo comparo con los 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 la claridad, simplemente porque agregamos dos caracteres más para escribir. Al igual que a veces queremos específicamente la ranura n. ° 3 en una matriz, a veces queremos que la entrada PATH esté fuera de %ENV . Citarlo solo no agrega claridad en lo que a mí respecta.

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

Tratar

$myhash{shift}

y solo vas a obtener el artículo almacenado en el hash bajo la tecla ''shift'' , tienes que hacer esto

$myhash{shift()}

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

Además, uso jEdit , el ÚNICO editor visual (que he visto, además de emacs) que le permite un control total sobre el resaltado. Entonces es doblemente claro para mí. Todo lo que se parece al anterior obtiene KEYWORD3 ($ myhash) + SÍMBOLO ({) + LITERAL2 (shift) + SÍMBOLO (}) si hay una paranthesis antes del cierre rizado se obtiene KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL (()}). Además, es probable que también lo formatee de esta manera:

$myhash{ shift() }


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


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


También puede preceder la tecla con un " - " (menos el carácter), pero tenga en cuenta que esto agrega el " - " al comienzo de su clave. De parte de mi código:

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

Uso la comilla simple, la comilla doble y también la forma quoiss. Todo en el mismo programa :-)


Voy sin comillas, solo porque es menos escribir, leer y preocuparse. Los tiempos en los que tengo una llave que no se cita automáticamente son pocos y distantes entre sí para no valer todo el trabajo extra y el desorden. Tal vez mi elección de las teclas hash ha cambiado para adaptarse a mi estilo, que es igual de bueno. Evita los casos extremos por completo.

Es la misma razón por la que uso " de manera predeterminada. Es más común para mí colocar una variable en el medio de una cadena que usar un carácter que no quiero interpolar. Es decir, tengo más a menudo escrito ''Hello, my name is $name'' que "You owe me $1000" .