Perlsyntax

8

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.

    
robobooga 17.02.2011, 10:00
quelle

5 Antworten

12

In Perl wurden Funktionsaufrufe so optimiert, dass das & sigil nicht immer benötigt wird. Wenn Sie ein Unterprogramm deklarieren:

%Vor%

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:

%Vor%

Hier teilt der (\%) -Prototyp perl mit, dass das erste Argument für mykeys ein Literal-Hash sein muss (der als Hash-Referenz übergeben wird).

%Vor%

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:

%Vor%

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.

%Vor%

Sie können das Schlüsselwort our verwenden, um einen lexikalischen Alias ​​für eine globale Variable zu erstellen:

%Vor%     
Eric Strom 17.02.2011, 18:58
quelle
8

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.

%Vor%     
Tim 17.02.2011 10:01
quelle
5
  

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?

  1. Rückwärtskompatibilität (daher use strict; keine eindeutigen Variablendeklarationen zulassen)
  2. Variablen können auch mit our oder local deklariert werden
Quentin 17.02.2011 10:03
quelle
4

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.

    
mscha 17.02.2011 11:56
quelle
0

& 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]

    
w.k 17.02.2011 11:40
quelle

Tags und Links