Darf ich wissen, was &
vor den Subs benutzt, wenn ohne es die Subs noch laufen können.
Und auch das my
vor Perl-Variablen.
Ich weiß, dass es für eine strenge Sprachsyntax ist oder was nicht, aber warum machen sie es nicht einfach zum Standard, dass jede Variable von einem my
deklariert werden muss?
BEARBEITEN
Vielen Dank für all Ihre Diskussionen / Antworten, ich möchte viele Ihrer Antworten akzeptieren, aber da ich nur eins akzeptieren kann, werde ich das akzeptieren, wo andere Benutzer es leicht verstehen.
In Perl wurden Funktionsaufrufe so optimiert, dass das &
sigil nicht immer benötigt wird. Wenn Sie ein Unterprogramm deklarieren:
Sie können es als hello;
oder hello();
oder &hello();
nennen, was alle dasselbe tun wird.
Wenn Ihr Unterprogramm Argumente verwendet, ist es ein wenig anders:
%Vor% Wie Sie sehen, ist die Verwendung von &
sigil weitgehend redundant, außer in Fällen, in denen keine Argumentliste vorhanden ist. In diesem Fall wird das Unterprogramm mit den aktuellen Werten in @_
aufgerufen.
Das &
sigil hat noch ein anderes spezielles Verhalten, das sich auf Perls Prototypen bezieht. Angenommen, Sie haben Ihre eigene keys
-Funktion geschrieben und möchten, dass sie sich wie Perl verhält:
Hier teilt der (\%)
-Prototyp perl mit, dass das erste Argument für mykeys
ein Literal-Hash sein muss (der als Hash-Referenz übergeben wird).
Wenn Sie aus irgendeinem Grund diese Anforderung umgehen müssen (im Allgemeinen nicht die beste Idee), könnten Sie dies schreiben:
%Vor% In diesem Fall wird durch das Hinzufügen von &
vor dem Unterbefehl die Überprüfung des Prototyps und alle nachfolgenden Aktionen deaktiviert, die es ausgeführt hätte (z. B. die Referenz). In dieser Verwendung ist &
im Grunde eine Behauptung, dass Sie genau wissen, welche Argumente mykeys
benötigt, und Sie wollen nicht, dass Perl in die Quere kommt.
Im Allgemeinen sollte die Verwendung von &
in Subroutinen vermieden werden, es sei denn, Sie möchten explizit eines der oben genannten Verhaltensweisen verwenden.
Schließlich wird &
auch benötigt, wenn Sie auf die eigentliche Codereferenz verweisen:
oder
%Vor% Wie andere bereits erwähnt haben, deklariert der Operator my
Variablen im aktuellen lexikalischen Gültigkeitsbereich. Dies ist erforderlich, wenn das Pragma use strict;
geladen ist. Perl hat zwei Arten von Variablen, lexikalische Variablen, die mit my
deklariert sind, und Paketvariablen.
my
Variablen leben in einem so genannten lexikalischen Pad, einem Speicherbereich, der von Perl jedes Mal erstellt wird, wenn ein neuer Bereich eingeführt wird. Paketvariablen leben in der globalen Symboltabelle.
Sie können das Schlüsselwort our
verwenden, um einen lexikalischen Alias für eine globale Variable zu erstellen:
Das my
begrenzt die Variable auf den aktuellen Bereich. Mit dem Pragma use strict
, das Sie verwenden sollten, müssen Sie die Variablen deklarieren (z. B. mit my
). Die Alternative, auf die verzichtet wird, besteht aus Gründen der Flexibilität für sehr kurze Skripts.
&
wird selten mehr verwendet, da Perl standardmäßig sigillose Wörter als Unterroutinen interpretiert, aber nützlich ist, wenn Sie einen Verweis auf Unterroutine erstellen möchten.
Darf ich wissen, wie der & amp; vor Subs, wenn ohne es die Subs noch laufen können.
Rückwärtskompatibilität mit Perl 4
Und auch die my vor Perl Variablen.
Er legt den Blockumfang fest
Ich weiß, dass es für eine strenge Sprachsyntax ist oder was nicht, aber warum machen sie es nicht einfach zum Standard, dass jede Variable von einem my deklariert werden muss?
use strict;
keine eindeutigen Variablendeklarationen zulassen) our
oder local
deklariert werden
Wenn Sie wissen möchten, wie man moderne Perl schreibt, kann ich Ihnen empfehlen, Modern Perl zu lesen? Sie können eine tote Baumversion kaufen oder eine elektronische Version kostenlos herunterladen.
&
hat immer noch eine ziemlich gute Unterscheidung: das Aufrufen mit ( &YourSub
) macht das aktuelle @_
auch für das aufgerufene Sub sichtbar. Jedenfalls benutze ich es in meinen Skripten hauptsächlich aus Gründen der Übersichtlichkeit: es macht deutlich, welche eigenen Funktionen ich habe und welche Funktionen von Core oder Modulen funktionieren.
Über my
. Jedes Tutorial und Dokument schlägt vor, use strict;
pragma zu verwenden, also deklarieren Sie Ihre Version auch mit my
. Aus meiner Sicht ist die Situation also ziemlich zurück: Wenn Scope für die beste Praxis so wichtig ist, wäre es normal, dass Variablen standardmäßig (wie wir sagen mit my
jetzt) und wenn wir wirklich globale Variablen brauchen, wir sollten sie als solche erklären. Ich verstehe, dass es das Erbe von Perl ist, aber dennoch ist es gegen Perls Ideologie, die Redundanz zu vermeiden. Die Verwendung von my
bei jeder Deklaration könnte durch eine Art von Pragma überschrieben werden. [Tut mir leid, Robobooga, vielleicht zu weit von Ihrer Frage]