Warum kann ich nicht print $ someshash {$ var} {fh} "foo" sagen?

8

Ich habe eine Codezeile in folgenden Zeilen:

%Vor%

Der Hash enthält das Dateihandle ein paar Ebenen tiefer. Der Fehler ist:

%Vor%

Ich kann das beheben, indem ich Folgendes tue:

%Vor%

... aber gibt es einen One-Liner?

    
mike 12.02.2009, 23:46
quelle

3 Antworten

23

siehe Ссылка

  

Beachten Sie, dass wenn Sie speichern   FILEHANDLE in einem Array, oder wenn Sie es sind   einen anderen Ausdruck mehr verwenden   komplex als eine skalare Variable zu   rufen Sie es ab , Sie müssen ein verwenden   Block, der den Dateihandlewert zurückgibt   stattdessen: ...

In Ihrem Fall würden Sie also einen Block wie diesen verwenden:

%Vor%     
j w 12.02.2009, 23:54
quelle
10

Wenn Sie etwas anderes als einen einfachen Skalar als Dateihandle haben, müssen Sie die Referenz, die das Dateihandle enthält, in geschweifte Klammern schreiben, damit Perl die Anweisung parsen kann:

%Vor%

Ein Teil von Best Practices von Perl besagt, dass ich Dateihandles immer nur aus geschweiften Klammern in Klammern umschließe, obwohl ich damit nicht so verrückt bin.

Die Syntax ist ungerade, da print eine indirekte Methode für ein Dateihandleobjekt ist:

%Vor%

Sie haben das vielleicht in der CGI.pm alten Schule gesehen. Hier sind zwei indirekte Methodenaufrufe:

%Vor%

Das funktioniert fast gut (siehe Schwerns Antwort auf die Mehrdeutigkeit ), solange das Objekt in einem einfachen Skalar ist. Wenn ich jedoch das $cgi_object in einen Hash setze, bekomme ich den gleichen Syntaxfehler, den Sie mit print bekommen haben. Ich kann die Klammern um den Hash-Zugriff legen, damit es funktioniert. Weiter mit dem vorherigen Code:

%Vor%

Das ist ein bisschen klobig, also benutzt einfach die Pfeilnotation für alles:

%Vor%

Sie können das gleiche mit Dateihandles machen, obwohl Sie das IO :: Handle -Modul verwenden müssen alles funktioniert:

%Vor%     
brian d foy 13.02.2009 05:32
quelle
5

Die obigen Antworten sind alle korrekt. Der Grund, warum sie dort keinen vollständigen Ausdruck erlauben ist print FH LIST ist schon eine ziemlich seltsame Syntax. Etwas Komplizierteres darin einzuführen, würde eine Menge mehrdeutiger Syntax einführen. Der Block entfernte diese Mehrdeutigkeit.

Um zu sehen, wohin dieser Wahnsinn führt, betrachte den Horror als indirekte Objekt-Syntax.

%Vor%     
Schwern 14.02.2009 00:27
quelle

Tags und Links