Wo werden Perl-Konstanten durch ihre Werte ersetzt?

8

Ich habe versucht, use constant -Werte in Perl zu setzen und stolperte über das folgende seltsame Verhalten:

%Vor%

gibt

aus %Vor%

Die Konstante a wurde auf der rechten Seite der Ausdrücke $d{a} = a und a => a ersetzt, aber nicht auf der linken Seite.

Ich weiß, dass Konstanten mit inlinable Subs implementiert werden ( hier dokumentiert ) und dass Subnamen ausgewertet werden ihre Namen, wenn sie nicht vorbelegt sind ( hier dokumentiert ), aber ich sehe keinen Grund, warum in meinem Beispiel a wertet einmal den Wert und einmal den Namen in derselben Codezeile aus, besonders in der Zuweisung zum Hash - Die a => a könnte eine Konsequenz von => sein, die die linke Seite als String interpretiert, wenn sie mit einem Buchstaben beginnt .

Nebenbemerkung: Das Hinzufügen von Klammern, um den Unteraufruf explizit zu machen, ergibt das erwartete Ergebnis:

%Vor%

Ausgabe:

%Vor%

(alle Beispiele mit Perl 5.18 getestet)

    
urzeit 12.12.2016, 05:46
quelle

1 Antwort

14

Das Ende der konstanten Seite unter CAVEATS , hat die Antwort

  

Sie können Probleme bekommen, wenn Sie Konstanten in einem Kontext verwenden, der Barcodes automatisch anführt (wie bei jedem Unterprogrammaufruf). Zum Beispiel können Sie $hash{CONSTANT} nicht sagen, weil CONSTANT als String interpretiert wird.

Es wird dann mit der gefundenen Lösung fortgefahren

  

Verwenden Sie $hash{CONSTANT()} oder $hash{+CONSTANT} , um zu verhindern, dass der Bareword-Quotierungsmechanismus eingesetzt wird.

Dann buchstabiert es das auch für Hashes

  

Ähnlich, da der Operator => ein Bareword direkt links von sich aus anführt, müssen Sie CONSTANT() => 'value' angeben (oder einfach ein Komma anstelle des großen Pfeils verwenden) anstelle von CONSTANT => 'value' .

    
zdim 12.12.2016, 05:52
quelle

Tags und Links