Frage

Ist es eine gute Idee Schlüssel zu zitieren, wenn ein Hash in Perl?

Ich arbeite an einer extrem großen Vermächtnis Perl Code-Basis und zu versuchen, eine Menge der besten Praktiken von Damian Conway in vorgeschlagen zu übernehmen: Perl Best Practices . Ich weiß, dass Best Practices immer ein heikles Thema mit Programmierern, aber hoffentlich kann ich einige gute Antworten auf diese ein, ohne eine Flamme Krieg zu beginnen. Ich weiß auch, dass dies wahrscheinlich etwas, das viele Menschen nicht über würden argumentieren, weil es noch ein kleines Problem zu sein, aber ich versuche, eine solide Liste von Leitlinien zu bekommen zu folgen, wie ich meinen Weg durch diese Code-Basis arbeiten.

In dem Perl Best Practices Buch von Damian Conway , gibt es dieses Beispiel, das zeigt, wie die Ausrichtung hilft Lesbarkeit eines Abschnitts von Code, aber es erwähnt nicht (überall in dem Buch, das ich finden kann) etwas über unter Angabe der Hash-Schlüssel.

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

Wäre das nicht besser mit Zitaten geschrieben werden zu betonen, dass man nicht bloße Worte verwenden?

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

Lösung

Wenn konstante String-Hash-Schlüssel spezifizieren, sollten Sie immer verwenden (einfache) Anführungszeichen. Z. B. $hash{'key'} Dies ist die beste Wahl, weil sie die Notwendigkeit beseitigt zu diesem Problem und führt zu einer konsistenten Formatierung zu denken. Wenn Sie die Anführungszeichen manchmal weglassen, müssen Sie daran denken, um sie hinzuzufügen, wenn der Schlüssel interne Bindestriche enthält, Leerzeichen oder andere Sonderzeichen. Sie muss verwenden Zitate in diesen Fällen zu inkonsistenter Formatierung führenden (manchmal nicht notiert, zitiert manchmal). Zitiert Tasten sind auch eher von einem Editor mit Syntax-hervorgehoben werden.

Hier ist ein Beispiel, wo die Verwendung von „manchmal zitiert, nicht zu anderen Zeiten zitiert:“ Konvention können Sie in Schwierigkeiten geraten:

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

Das wird kompiliert ganz gut unter use strict, wird aber nicht ganz das tun, was Sie zur Laufzeit erwarten. Hash-Schlüssel sind Strings. Strings sollten gegebenenfalls für deren Inhalt angegeben werden: einfache Anführungszeichen für Zeichenketten, doppelte Anführungszeichen variable Interpolation zu ermöglichen. Geben Sie Ihre Hash-Schlüssel. Es ist die sicherste Konvention und am einfachsten zu verstehen und zu befolgen.

Andere Tipps

Ohne Anführungszeichen ist besser. Es ist in {}, so ist es offensichtlich, dass Sie nicht mit Barewords werden, und es ist sowohl einfacher zu lesen und Typen (zwei weniger Symbole). Aber all dies ist abhängig von den Programmierern, natürlich.

ich nie einzelne Anführungszeichen Hash-Schlüssel. Ich weiß, dass {} im Grunde funktioniert wie Anführungszeichen tun, außer in besonderen Fällen (a + und doppelte Anführungszeichen). Mein Redakteur weiß das auch, und gibt mir ein paar farbbasierte Signale, um sicherzustellen, dass ich tat, was ich wollte.

Mit Apostrophe scheint überall zu mir wie eine „defensiven“ Praxis von Menschen begangen, die Perl nicht kennen. Sparen Sie etwas Tastatur Verschleiß und lernen Perl:)

Mit dem Wortschwall aus dem Weg, der eigentliche Grund, warum ich diesen Kommentar bin Entsendung ... die anderen Kommentare scheinen die Tatsache, dass + wird „Ende des Zitats“ ein Bareword verpasst zu haben. Das heißt, Sie schreiben:

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

oder:

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

So ist es ziemlich klar, dass +shift bedeutet „rufen Sie die Shift-Funktion“ und shift bedeutet „die Zeichenfolge‚Shift‘.“

Ich will auch darauf hinweisen, dass cperl-Modus korrekt alle verschiedenen Fälle hervorhebt. Wenn dies nicht der Fall, ping mich im IRC und ich werde es fix:)

(Oh, und noch eine Sache. Ich zitiere Attributnamen in Moose, wie in has 'foo' => .... Dies ist eine Gewohnheit, die ich aus nahm mit stevan zu arbeiten, und obwohl ich denke, es sieht gut aus ... es ist ein bisschen widersprüchlich mit dem Rest meines Codes. Vielleicht werde ich es bald aufhören.)

Quoteless Hash-Schlüssel erhalten Syntax-Ebene Aufmerksamkeit von Larry Wall, um sicherzustellen, dass es keinen Grund für sie zu sein, andere als Best Practice. Schwitzen Sie nicht die Anführungszeichen.

(übrigens zitiert auf Array-Schlüssel sind best practice in PHP, und es schwerwiegende Folgen versagt werden kann, sie zu benutzen, nicht Tonnen E_WARNINGs zu erwähnen. Okay, in Perl! = In Ordnung in PHP ).

Ich glaube nicht, dass es eine bewährte Methode auf diesem. Ich persönlich verwende sie in Hash-Schlüssel wie folgt:

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

sie aber nicht links von dem Pfeil-Operator verwenden:

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

Frag mich nicht warum, es ist nur so, wie ich es tun:)

Ich denke, das Wichtigste, was Sie tun können, ist, immer, immer, immer:

use strict;
use warnings; 

Auf diese Weise der Compiler keine semantische Fehler für Sie fangen, so dass Sie weniger wahrscheinlich, dass etwas falsch eingeben, je nachdem welche Art und Weise Sie sich entscheiden, zu gehen.

Und das zweite Wichtigste ist, konsequent sein.

Ich gehe ohne Anführungszeichen, nur weil es weniger ist etwa zu geben und zu lesen und kümmern. Die Zeiten, in denen ich einen Schlüssel haben, die nicht automatisch notiert sein werden, sind dünn gesät, um nicht wert all die zusätzliche Arbeit und Unordnung zu sein. Vielleicht haben meine Wahl der Hash-Schlüssel geändert, meinen Stil zu passen, die genauso gut ist. Vermeiden Sie die Grenzfälle vollständig.

Es ist eine Art aus dem gleichen Grund, warum ich " als Standard zu verwenden. Es ist häufiger für mich eine Variable in der Mitte einer Zeichenfolge plop als ein Zeichen zu verwenden, die ich nicht interpoliert werden soll. Das ist zu sagen, ich habe öfter geschrieben 'Hello, my name is $name' als "You owe me $1000".

Mindestens unter Angabe verhindert Syntaxhervorhebung reservierte Worte nicht so perfekt Editoren. Check out:

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

Ich ziehe es ohne Anführungszeichen zu gehen, es sei denn ich eine Schnur Interpolation wollen. Und dann verwende ich doppelte Anführungszeichen. Ich vergleiche es zu wörtlichen Zahlen. Perl würde wirklich können Sie Folgendes tun:

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

Aber niemand tut das. Und es hilft nicht, mit Klarheit, einfach weil wir zwei weitere Zeichen hinzufügen eingeben. Genau wie manchmal gesagt wollen # 3 in einem Array Slot wir, wir manchmal aus PATH den %ENV Eintrag möchten. Single-zitieren sie fügen nicht Klarheit so weit es mich betrifft.

Die Art und Weise Perl Code analysiert macht es unmöglich, andere Arten von „bloßen Worten“ in einem Hash-Index zu verwenden.

Versuchen

$myhash{shift}

und Sie werden nur das Element in der Hash unter dem 'shift' Schlüssel gespeichert werden, müssen Sie dies tun

$myhash{shift()}

, um anzugeben, dass das erste Argument möchten Ihre Hash-Index.

Darüber hinaus verwende ich jEdit , die nur visueller Editor (dass ich gesehen hat - neben emacs), das erlaubt Sie die totale Kontrolle über Hervorhebung. So ist es doppelt mir klar. Alles, wie der ehemalige suchen bekommt Begriff3 ($ myhash) + SYMBOL ({) + LITERAL2 (Shift) + SYMBOL (}), wenn es eine geklam- mert vor dem schließenden geschweiften wird es Begriff3 + SYMBOL + KEYWORD1 + SYMBOL (()}). Plus Ich werde es wahrscheinlich, wie Sie dieses Format auch:

$myhash{ shift() }

mit Anführungszeichen Go! Sie brechen visuell die Syntax und Editoren werden sie in der Syntax unterstützen Hervorhebung (hey, auch Stack-Überlauf hervorhebt das Zitat-Version). Ich würde auch behaupten, dass Sie Fehler schneller mit Redakteuren Überprüfung feststellen würden, dass Sie Ihr Zitat beendet.

Es ist besser, mit Anführungszeichen, weil es Sie Sonderzeichen verwenden können nicht in Barewords erlaubt. Durch Anführungszeichen kann ich die Sonderzeichen meiner Muttersprache in Hash-Schlüssel verwenden.

Sie können den Schlüssel mit einem „-“ vorangestellt (Minuszeichen) auch, aber darüber im Klaren sein, dass dies die „-“ auf den anhängt Anfang Ihren Schlüssels. Von einigen meiner Code:

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

Ich verwende das Apostroph, Anführungszeichen und quoteless Art und Weise zu. Alle im gleichen Programm: -)

Ich habe darüber gewundert mich, vor allem, wenn ich gefunden habe ich einige Verfehlungen gemacht:

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

Was ich neige dazu, jetzt zu tun ist, zitiert auf einer Basis pro-Hash universell anzuwenden, wenn mindestens eine der wörtlichen Schlüssel braucht sie; und klammert mit Konstanten:

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

Ich habe verwendet sie immer ohne Anführungszeichen, aber ich würde die Verwendung von strengen und Warnungen Echo, wie sie die meisten der häufigsten Fehler herausgreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top