Warum verwendet die open () - Dokumentation von Perl zwei verschiedene FILEHANDLE-Stile?

8

Die Dokumentation für die Open-Funktion zeigt die Syntax von open() as:

  • öffnen FILEHANDLE, EXPR
  • öffnen FILEHANDLE, MODE, EXPR
  • öffne FILEHANDLE, MODE, EXPR, LIST
  • Öffnen Sie FILEHANDLE, MODUS, REFERENZ
  • öffnen FILEHANDLE

Unten in den Beispielen haben sie Orte, an denen eine normale $ -Variable-Variable für das Datei-Handle verwendet wird:

%Vor%

und auch Beispiele, wo ein bareword verwendet wird:

%Vor%

Eine Frage ist, wie lautet der Name jedes Stils wie in "Ich verwende _ _ für ein Dateihandle" in jedem Fall? Der andere ist Warum haben sie begonnen, bare words für open() in der Dokumentation zu verwenden? Es scheint, dass die späteren Verwendungen alle nicht den normalen Dateinamen open() s beinhalten. Ist das $ -Formular in diesen Fällen nicht akzeptabel?

    
Scooter 29.06.2013, 02:38
quelle

2 Antworten

20

Das Bareword-Formular ist im Wesentlichen nur ein historisches Vermächtnis für die Abwärtskompatibilität. Die Verwendung einer lexikalischen Variablen ist immer die richtige Sache für neuen Code.

→ Übrigens ist $x eine lexikalische Skalarvariable , wobei FOO , wie Sie sagten, ein Bareword

genannt wird

Details / Exkurs

Nur der Vollständigkeit halber, wie @Joe_Z in den Kommentaren darauf hingewiesen hat, sind die lexikalischen Dateihandle-Objekte "relativ neu", als Teil des ziemlich wichtigen Neuschreibens zwischen Perl 5.005 und 5.6 (sie haben in dieser Version sogar ganze Größenordnungen erreicht) Nummer ...).

Jedoch wird das Barewort FOO (oder z. B. STDIN ) technisch in einem separaten Namespace nur für Dateihandles interpretiert. Da es für den Dateihandle-Namespace kein Sigil (wie $ @ % & ) gibt, gibt es nur zwei Möglichkeiten, auf ein Dateihandle in diesem Namespace zu verweisen:

  • Sie können im indirekten Objekt-Slot bestimmter Funktionen, wie print , darauf verweisen, dass ein Bareword aus historischen Gründen auf ein Dateihandle verweisen muss (hinter den Kulissen);
  • Sie können einen typeglob wie *FOO verwenden, der auf "alles in einem beliebigen Namespace verweist, der zufällig an das Symbol% ​​co_de% gebunden ist.

Beachten Sie, dass in einigen Sprachen, wie C oder Scheme, ein einzelnes Symbol keine Typ-Sigillen hat und daher alle Symbole nur auf eine Weise gebunden sein können (zB kann keine Variable FOO und eine Funktion% co_de haben) % in C ... allgemein), während in Perl oder (zB) Common Lisp dasselbe Symbol% ​​co_de% an viele verschiedene Dinge gebunden sein kann; Der Unterschied ist, dass Perl in den meisten Kontexten tatsächlich die Verwendung von Sigillen zur Unterscheidung von "welcher printf meinst du" verwendet. printf , foo = foo , $foo , @foo = @foo[ $x .. $y] = $foo[ $n ] , %foo und dergleichen.

Wenn Sie Barcodes als Dateihandles verwenden, verlieren Sie jedoch einige Fähigkeiten:

Um sie lokal oder lexikalisch (statt global) zu binden, müssen Sie jedes -Symbol in jedem Namespace binden, da kein Sigil verfügbar ist. Somit können @foo{ $k1, $k2 } und $foo{ $k } in zwei verschiedenen Scratchpads (Scopes) leben, wobei das eine das andere überlebt; aber &foo würde beides beinhalten, ebenso wie das Dateihandle my $foo (und möglicherweise andere obskure Eckfälle wie my @foo specifiers, obwohl ich nicht darauf schwöre).

Es ist auch ungeheuer schwierig, ein bareword-artiges Dateihandle in eine Funktion und ähnliches zu überführen.

Grundsätzlich erben Barcodes alle Nachteile des globalen Gültigkeitsbereichs und haben keinen der Vorteile von lexikalischen Variablen.

my *foo hat einen schönen Abschnitt zu Typeglobs und Dateihandles , der diese Dinge wahrscheinlich auch etwas deutlicher erklärt. Ich habe meine Kopie nicht griffbereit, aber ich glaube, die Kamel geht auch detaillierter auf das Thema ein.

    
BRFennPocock 29.06.2013 02:42
quelle
2

Wie BPRocock sagte, wird my $x in diesen Tagen bevorzugt, während FOO als obsolet gilt, weil FOO eine Art von globalen Variablen ist, sodass es zu Konflikten mit Namen kommen kann, die an einem anderen Ort verwendet werden. Es gibt einen weiteren Grund, warum $x empfohlen wird: $x wird automatisch am Ende des Bereichs close ed.

    
FUJI Goro 29.06.2013 16:13
quelle

Tags und Links