Domanda

È una buona idea citare le chiavi quando si usa un hash in Perl?

Sto lavorando su una base di codice Perl legacy estremamente ampia e sto provando ad adottare molte delle migliori pratiche suggerite da Damian Conway in Best Practices Perl . So che le migliori pratiche sono sempre un argomento delicato con i programmatori, ma spero di poter ottenere delle buone risposte su questo senza iniziare una guerra di fiamma. So anche che questo è probabilmente qualcosa su cui molte persone non litigherebbero perché è un problema minore, ma sto cercando di ottenere un solido elenco di linee guida da seguire mentre lavoro attraverso questa base di codice.

Nel libro sulle best practice del Perl di Damian Conway , c'è questo esempio che mostra come l'allineamento aiuta leggibilità di una sezione di codice, ma non menziona (in nessuna parte del libro che riesco a trovare) nulla riguardo alla citazione delle chiavi hash.

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

Non sarebbe meglio che sia scritto tra virgolette per sottolineare che non stai usando parole nude?

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

Soluzione

Quando si specificano chiavi hash a stringa costante, è necessario utilizzare sempre virgolette (singole). Ad esempio, $ hash {'key'} Questa è la scelta migliore perché evita la necessità di pensare a questo problema e porta a una formattazione coerente. Se a volte lasci le virgolette, devi ricordarti di aggiungerle quando la tua chiave contiene valori interni, spazi o altri caratteri speciali. devi usare le virgolette in quei casi, portando a una formattazione incoerente (a volte non quotata, a volte quotata). Le chiavi tra virgolette hanno anche maggiori probabilità di essere evidenziate dalla sintassi dal tuo editor.

Ecco un esempio in cui l'utilizzo del "quotato a volte, non quotato altre volte" la convenzione può metterti nei guai:

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

Questo verrà compilato bene in usa strict , ma non farà esattamente quello che ti aspetti in fase di esecuzione. Le chiavi hash sono stringhe. Le stringhe devono essere quotate in base al loro contenuto: virgolette singole per stringhe letterali, virgolette doppie per consentire l'interpolazione variabile. Cita le tue chiavi hash. È la convenzione più sicura e la più semplice da capire e seguire.

Altri suggerimenti

Senza virgolette è meglio. È in {}, quindi è ovvio che non stai usando le password, inoltre è più facile da leggere e digitare (due simboli in meno). Ma tutto ciò dipende dal programmatore, ovviamente.

Non ho mai virgolette singole. So che {} funziona fondamentalmente come fanno le virgolette, tranne in casi speciali (a + e virgolette doppie). Anche il mio editore lo sa e mi dà alcuni spunti basati sul colore per assicurarmi di aver fatto ciò che intendevo.

L'uso delle virgolette singole ovunque mi sembra una "difesa". pratica perpetrata da persone che non conoscono il Perl. Risparmia un po 'di usura della tastiera e impara il Perl :)

Con il rant di mezzo, il vero motivo per cui sto postando questo commento ... gli altri commenti sembrano aver perso il fatto che + non quoterà " " una parola nuda. Ciò significa che puoi scrivere:

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

o

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

Quindi è abbastanza chiaro che + shift significa " chiama la funzione shift " e shift significa " la stringa 'shift' " ;.

Sottolineerò anche che la modalità cperl evidenzia correttamente tutti i vari casi. In caso contrario, eseguimi il ping su IRC e lo risolverò :)

(Oh, e un'altra cosa. Cito i nomi degli attributi in Moose, come in ha 'foo' = > ... . Questa è un'abitudine che ho preso lavorando con stevan e anche se penso che sia bello ... è un po 'incoerente con il resto del mio codice. Forse smetterò di farlo presto.)

Le chiavi hash Quoteless hanno ricevuto attenzione a livello di sintassi da Larry Wall per assicurarsi che non vi fossero motivi per cui essere diverse dalle best practice. Non sudare tra virgolette.

(Per inciso, le virgolette sulle chiavi dell'array sono le migliori pratiche in PHP, e ci possono essere serie conseguenze nel non usarle, per non parlare di tonnellate di E_WARNINGs. Okay in Perl! = okay in PHP .)

Non credo che ci sia una buona pratica su questo. Personalmente li uso in hash keys in questo modo:

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

ma non usarli a sinistra dell'operatore freccia:

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

Non chiedermi perché, è solo il modo in cui lo faccio :)

Penso che la cosa più importante che puoi fare sia sempre, sempre, sempre:

use strict;
use warnings; 

In questo modo il compilatore rileverà eventuali errori semantici per te, lasciandoti meno probabilità di digitare in modo errato qualcosa, in qualunque modo tu decida di andare.

E la seconda cosa più importante è essere coerenti.

Vado senza virgolette, solo perché è meno da scrivere, leggere e preoccuparsi. I tempi in cui ho una chiave che non verrà quotata automaticamente sono pochi e lontani tra loro in modo da non valere tutto il lavoro extra e il disordine. Forse la mia scelta di chiavi hash è cambiata per adattarsi al mio stile, il che è altrettanto. Evita del tutto i casi limite.

È una specie dello stesso motivo per cui utilizzo " per impostazione predefinita. È più comune per me lanciare una variabile nel mezzo di una stringa piuttosto che usare un carattere che non voglio interpolare. Vale a dire, ho spesso scritto 'Ciao, il mio nome è $ name' rispetto a " Mi devi $ 1000 " .

Almeno, la citazione impedisce la sintassi evidenziando le parole riservate in editor non così perfetti. Dai un'occhiata:

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

Preferisco andare senza virgolette, a meno che non voglia interpolazione di stringhe. E poi uso le doppie virgolette. L'ho paragonato a numeri letterali. Perl ti permetterebbe davvero di fare quanto segue:

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

Ma nessuno lo fa. E non aiuta con chiarezza, semplicemente perché aggiungiamo altri due caratteri da digitare. Proprio come a volte vogliamo specificamente lo slot n. 3 in un array, a volte vogliamo che la voce PATH sia % ENV . La citazione singola aggiunge no chiarezza per quanto mi riguarda.

Il modo in cui Perl analizza il codice rende impossibile utilizzare altri tipi di "parole nude" in un indice hash.

Prova

$myhash{shift}

e otterrai l'elemento memorizzato nell'hash nella chiave 'shift' , devi farlo

$myhash{shift()}

per specificare che vuoi che il primo argomento indicizzi il tuo hash.

Inoltre, utilizzo jEdit , l'editor visivo SOLO (che ho visto - oltre a emacs) che consente a tu il controllo totale sull'evidenziazione. Quindi è doppiamente chiaro per me. Qualunque cosa che assomigli al primo ottiene KEYWORD3 ($ myhash) + SYMBOL ({) + LITERAL2 (shift) + SYMBOL (}) se c'è una parantesi prima del ricciolo di chiusura ottiene KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL (()}). Inoltre probabilmente lo formatterò anche in questo modo:

$myhash{ shift() }

Vai con le virgolette! Rompono visivamente la sintassi e più editor li supporteranno nell'evidenziazione della sintassi (ehi, anche Stack Overflow sta evidenziando la versione del preventivo). Direi anche che noteresti errori di battitura più rapidamente con gli editor che controllano che hai terminato il tuo preventivo.

È meglio con le virgolette perché ti consente di utilizzare caratteri speciali non consentiti nelle parole non consentite. Usando le virgolette posso usare i caratteri speciali della mia madrelingua nelle chiavi hash.

Puoi precedere la chiave con un " - " (meno il carattere), ma tieni presente che questo aggiunge " - " all'inizio inizio della chiave. Da alcuni dei miei codici:

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

Uso anche le virgolette singole, le virgolette doppie e le modalità quoteless. Tutti nello stesso programma :-)

Me lo sono chiesto da solo, soprattutto quando ho scoperto di aver fatto alcuni errori:

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

Quello che tendo a fare ora è applicare le virgolette universalmente su una base per hash se almeno una delle chiavi letterali ne ha bisogno; e utilizzare le parentesi con costanti:

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

Li ho sempre usati senza virgolette ma farei eco all'uso di rigidi e avvertimenti mentre rilevano la maggior parte degli errori comuni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top