Frage

Eine Listenzuweisung im skalaren Kontext gibt die Anzahl der Elemente auf der rechten Seite zurück:

scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2

Warum bewertet es die rechte Seite und produziert 2 anstelle der neu definierten Liste, die bewertet und 3 zurückgegeben wird?

Für mich scheint es wie $hello bekommt 7, $there bekommt 8 und $world bekommt undef, Dann wird diese Liste im skalaren Kontext bewertet, was zu 3 führen würde, da dies die Anzahl der Elemente in der Liste ist ($hello $there $world). Es erscheint mir seltsam, dass der Kontext sich auswirkt, welcher Teil des bewerteten Ausdrucks zurückgegeben wird:

my $greeting = (($hello, $there, $world) = (7,8)); #2

my @greeting = (($hello, $there, $world) = (7,8));
my $greeting_length = @greeting; #3
War es hilfreich?

Lösung

Es ist dokumentiert, um die Elemente rechts in die Elemente zu zählen Perlop (Der letzte Satz im Abschnitt Zuordnungsbetreiber):

In ähnlicher Weise erzeugt eine Listenzuweisung im Listenkontext die Liste der zugewiesenen LVALUES, und eine Listenzuweisung im skalaren Kontext gibt die Anzahl der vom Ausdruck auf der rechten Seite der Zuordnung erzeugten Elemente zurück.

Der Grund, warum es so funktioniert, ist, dass Sie solche Dinge schreiben können:

while (my ($key, $value) = each %hash) { ... }

Wenn es die Anzahl der Elemente auf der linken Seite der Aufgabe zählte, wäre dies eine unendliche Schleife.

Wenn Sie darüber nachdenken, ist die Anzahl der Elemente auf der linken Seite entweder die gleiche wie auf der rechten Seite oder eine Konstante (wenn Sie einer Liste von Skalaren zuweisen). Im ersten Fall macht es keinen Unterschied, welche Seite Sie zählen, und im zweiten Fall ist es nützlicher, die rechte Seite zu zählen.

Auf der Listenkontext gibt der Zuordnungsoperator die linke Liste zurück, da dies nützlicher ist. Wenn Sie es in einem Kontext verwenden, der die Listenelemente ändert, möchten Sie die Variablen ändern, die gerade zugewiesen wurden.

Re: Dein Kommentar In Ihrem Beispiel, (7,8) ist eine Liste mit zwei Elementen, weshalb der Zuordnungsbetreiber 2 zurückgibt. Wenn Sie einer längeren Liste von Skalaren eine kürzere Liste zuweisen, ist die rechte Seite nicht "gepolstert" mit undef Bevor die Aufgabe stattfindet. Stattdessen werden alle Variablen, die keinen Wert aus der rechten Handliste haben, auf ihren Standardwert zurückgesetzt. Für eine skalare Variable ist das undef. Für Arrays ist das ein leeres Array. Für Hashes ist das ein leerer Hash.

Andere Tipps

Es scheint mir seltsam, dass Kontexteffekte, welche Seite bewertet wird:

Es tut es nicht. Beide Seiten (Operanden) des Listenzuweisungsbetreibers wurden bewertet, und ob die Listenzuweisung im skalaren Kontext oder im Listenkontext bewertet wird, wirkt sich nicht auf die Bewertung der Operanden aus.

Ob eine Listenzuweisung im skalaren Kontext oder im Listenkontext bewertet wird, wirkt sich nur auf den von ihm zurückgegebenen Wert aus.

Ich habe zuvor erstellt Scalar vs List -Zuweisungsoperator, was versucht, die Unterschiede zwischen den beiden Zuordnungsbetreibern und der Art und Weise, wie sie sich im Skalar- und Listenkontext verhalten, deutlich machen.

Warum bewertet es die rechte Seite und produziert 2 anstelle der neu definierten Liste, die bewertet und 3 zurückgegeben wird?

Denn die Sprachdefinition soll dies tun, denn das sollte Larry Wall entschieden.

Für mich scheint es, als würde $ Hello 7, $ dort 8 und $ world wird undef, dann wird diese Liste im skalaren Kontext bewertet

Nein, Perl funktioniert nicht so. Sie gehen davon aus (In diesem Fallzuweisung) sollte ein skalares Ergebnis erzielt werden, und es gibt häufig skalare Ergebnisse, die nützlicher sind als nur die Anzahl der Elemente im Listenkontextergebnis. für das, was Skalar produziert; Es ist nicht einheitlich. Für die Listenzuweisung ist der skalare Wert die Anzahl der Elemente auf der rechten Seite, da dies weitaus nützlicher ist als die Anzahl der Empfänger, was konstant ist. z.B, if (($a, $b) = $s =~ /$re/) Ist wahr, wenn das Match Ergebnisse erzielt hat, im Gegensatz zu immer wahr, weil es zwei Empfänger gibt.

Es erscheint mir seltsam, dass der Kontext sich auswirkt, welcher Teil des bewerteten Ausdrucks zurückgegeben wird

Es gibt weitaus seltsamere Dinge in Perl. Dieses Gefühl der Verrücktheit stammt aus einer Missverhältnis zwischen Modellen ... In diesem Fall ist Ihre Erwartung der Orthogonalität und Ihre Überzeugung, dass "skalarer Kontext" ein Operator auf Listen ist, im Vergleich zu Perls pragmatisches Design und der Realität, dass "skalarer Kontext" stellt einen Kontext fest das bestimmt, welches Ergebnis erzeugt werden soll. Beachten Sie, dass Sie Ihre eigenen Funktionen schreiben können, die erzeugen völlig unterschiedliche Ergebnisse abhängig vom Kontext des Anrufs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top