Die Priorität beim Zuweisen und Testen der Definiertheit in Perl

8

Wenn Sie versuchen, eine Variable zuzuweisen und sie in einer Operation in Perl auf ihre Definiertheit zu testen, wie es zum Beispiel in der Bedingung if nützlich wäre, wäre es für mich natürlich, zu schreiben:

%Vor%

Nach meinem Verständnis hat defined den Vorrang eines Rechtslistenoperators , die niedriger ist als die der Aufgabe, daher würde ich erwarten, dass mein Code wie folgt lautet:

%Vor%

Während letzterer Code in Klammern funktioniert, führt der erste zu dem folgenden schwerwiegenden Fehler: "Definierter Operator kann nicht in skalarer Zuweisung geändert werden."

Es ist keine große Sache, Klammern hinzuzufügen, aber ich würde gerne verstehen, warum die erste Version nicht funktioniert, z. Was für ein "Ding" ist defined und was hat Vorrang?

    
scozy 14.04.2014, 13:14
quelle

1 Antwort

10

Benannte Operatoren sind unterteilt in unäre Operatoren (Operatoren, die immer genau einen Operanden verwenden) und Listenoperatoren (alles andere) [1] .

defined und my [2] sind unäre Operatoren , die eine viel höhere Priorität haben als andere benannte Operatoren.

Das Gleiche gilt für Subs, also werde ich sie demonstrieren.

%Vor%

Aber natürlich ist defined keine Lvalue-Funktion, daher führt das Auffinden auf der LHS einer Zuweisung zu einem Fehler.

  1. and , or , not , xor , lt , le , gt , ge , eq , ne und cmp sind nicht als benannte Operatoren betrachtet.

  2. my ist sehr ungewöhnlich. Abgesehen davon, dass es sowohl einen Kompilierungszeit- als auch einen Laufzeit-Effekt hat, hängt seine Syntax davon ab, ob Parens um seine Argumente herum verwendet werden oder nicht. Ohne Parens ist es ein unärer Operator. Mit Parens ist es ein Listenoperator.

ikegami 14.04.2014, 13:23
quelle