Und das liegt daran, dass perldoc perlfaq4
erläutert die obige Zeile wie folgt (Hervorhebung hinzugefügt):
Da Sie einem Skalar zuweisen, ist die rechte Seite skalar Kontext. Der Komma-Operator (ja, es ist ein Operator!) Im skalaren Kontext wertet seine linke Seite aus, verwirft das Ergebnis und wertet es aus Es ist rechts und gibt das Ergebnis zurück. In der Tat, das list-lookalike weist
%Vor%$scalar
den am weitesten rechts liegenden Wert zu. Viele Leute vermasseln Sie das, weil sie ein list-lookalike auswählen, dessen letztes Element ist auch die Anzahl, die sie erwarten:
Was ich darunter verstehe, ist, dass es keine Liste im skalaren Kontext gibt.
ikegami behauptet jedoch, dass es " Ergebnis [s] in einem Listenoperator, so dass ist ein Listenliteral .
Also, ist es eine Liste oder nicht?
Ein Listenliteral ist etwas, das eigentlich eine Liste im Code ist, also ist (1, 2, 3)
ein Listenliteral, während caller
beispielsweise eine Funktion ist, die je nach Kontext eine Liste oder einen Skalar zurückgeben kann.
In einer Zeile wie:
%Vor% Der ...
sieht skalaren Kontext. Wenn also ...
ein Listenliteral wäre, hätten Sie ein Listenliteral im skalaren Kontext:
Das Listenliteral führt jedoch nicht zu einer Liste, weil der darin enthaltene Komma-Operator einen skalaren Kontext enthält, der dann das letzte Element des Listenliterals zurückgibt und die verbleibenden Werte nach der Auswertung wegwirft. p>
In Bezug auf eine Funktion sieht die Funktion selbst, aus welchem Kontext sie aufgerufen wird, der dann an jede Zeile in dieser Funktion weitergegeben wird. Sie können also eine Funktion im skalaren, list- oder void-Kontext haben, und wenn die letzte Zeile dieses Subs ein Listenliteral ist, wird dieses Listenliteral jeden dieser Kontexte sehen und sich entsprechend verhalten.
Das ist im Grunde eine terminologische Unterscheidung, wobei sich list literal
auf eine kommagetrennte Liste von Werten im tatsächlichen Quelltext * bezieht und list
sich auf eine Folge von Werten bezieht, die auf Perls Stack platziert sind.
Sie können Subroutinen mit Rückgabewerten schreiben, die sich entweder wie Arrays verhalten oder wie Listenliterale in Bezug auf den Kontext.
%Vor% * oder etwas, das zu einer Liste von kommagetrennten Werten führt, wie zum Beispiel ein qw()
oder ein fettes Komma =>
oder ein Hash- oder Array-Slice.
Sie können sich auch meine Antwort hier ansehen: Wie bekomme ich das erste Element von einer Funktion, die ein Array in Perl zurückgibt? , die etwas detaillierter über Listen geht.
> Ich stimme dir zu und mit perlfaq4
. Um perldata
zu zitieren, ist dies wahrscheinlich die definitive Dokumentation zu diesem Punkt:
In einem Kontext, in dem kein Listenwert erforderlich ist, ist der Wert von für ein Listenliteral einfach der Wert des letzten Elements wie beim C-Kommaoperator.
(Hervorhebung von mir).
Das heißt, ikegami ist berechtigt, die von ihm gewünschten Terminologien zu verwenden. Unterschiedliche Menschen denken an unterschiedliche Sprachkonstrukte mit unterschiedlichen Begriffen, und solange die Endergebnisse gleich sind, glaube ich nicht, dass es wichtig ist, wenn ihre Terminologie von der in der Dokumentation abweicht. (Es ist jedoch keine gute Idee, in einem öffentlichen Forum auf idiosynkratische Terminologie zu bestehen!)
Frag einfach Perl!
%Vor%Also kann man eine Liste im skalaren Kontext haben.
Man kann nicht eine Liste im skalaren Kontext zurückgeben . (Nun, es ist möglich von XS, aber das Programm wird abstürzen, wahrscheinlich mit einem "Bizarre Kopie" -Fehler.)
Es kann nicht anders sein. Wenn es eine eindeutige Liste op und Komma Op gäbe, wäre es unmöglich, Folgendes zu kompilieren:
%Vor%Würde dies zu einer Liste op oder einem Komma führen? In Wirklichkeit gibt es keinen solchen Unterschied, ja, es ergibt sich das op.
Frag einfach Perl!
%Vor%Also kann man eine Liste im skalaren Kontext haben.
Man kann nicht eine Liste im skalaren Kontext zurückgeben . (Nun, es ist möglich von XS, aber das Programm wird abstürzen, wahrscheinlich mit einem "Bizarre Kopie" -Fehler.)
Es kann nicht anders sein. Wenn es eine eindeutige Liste op und Komma Op gäbe, wäre es unmöglich, Folgendes zu kompilieren:
%Vor%Würde dies zu einer Liste op oder einem Komma führen? In Wirklichkeit gibt es keinen solchen Unterschied, ja, es ergibt sich das op.
Ein Listenliteral ist etwas, das eigentlich eine Liste im Code ist, also ist $scalar
ein Listenliteral, während 'confused'
beispielsweise eine Funktion ist, die je nach Kontext eine Liste oder einen Skalar zurückgeben kann.
In einer Zeile wie:
%Vor%Der %code% sieht skalaren Kontext. Wenn also %code% ein Listenliteral wäre, hätten Sie ein Listenliteral im skalaren Kontext:
%Vor%Das Listenliteral führt jedoch nicht zu einer Liste, weil der darin enthaltene Komma-Operator einen skalaren Kontext enthält, der dann das letzte Element des Listenliterals zurückgibt und die verbleibenden Werte nach der Auswertung wegwirft. p>
In Bezug auf eine Funktion sieht die Funktion selbst, aus welchem Kontext sie aufgerufen wird, der dann an jede Zeile in dieser Funktion weitergegeben wird. Sie können also eine Funktion im skalaren, list- oder void-Kontext haben, und wenn die letzte Zeile dieses Subs ein Listenliteral ist, wird dieses Listenliteral jeden dieser Kontexte sehen und sich entsprechend verhalten.
Das ist im Grunde eine terminologische Unterscheidung, wobei sich %code% auf eine kommagetrennte Liste von Werten im tatsächlichen Quelltext * bezieht und %code% sich auf eine Folge von Werten bezieht, die auf Perls Stack platziert sind.
Sie können Subroutinen mit Rückgabewerten schreiben, die sich entweder wie Arrays verhalten oder wie Listenliterale in Bezug auf den Kontext.
%Vor%* oder etwas, das zu einer Liste von kommagetrennten Werten führt, wie zum Beispiel ein %code% oder ein fettes Komma %code% oder ein Hash- oder Array-Slice.
Sie können sich auch meine Antwort hier ansehen: Wie bekomme ich das erste Element von einer Funktion, die ein Array in Perl zurückgibt? , die etwas detaillierter über Listen geht.
>Ich stimme dir zu und mit %code% . Um %code% zu zitieren, ist dies wahrscheinlich die definitive Dokumentation zu diesem Punkt:
In einem Kontext, in dem kein Listenwert erforderlich ist, ist der Wert von für ein Listenliteral einfach der Wert des letzten Elements wie beim C-Kommaoperator.
(Hervorhebung von mir).
Das heißt, ikegami ist berechtigt, die von ihm gewünschten Terminologien zu verwenden. Unterschiedliche Menschen denken an unterschiedliche Sprachkonstrukte mit unterschiedlichen Begriffen, und solange die Endergebnisse gleich sind, glaube ich nicht, dass es wichtig ist, wenn ihre Terminologie von der in der Dokumentation abweicht. (Es ist jedoch keine gute Idee, in einem öffentlichen Forum auf idiosynkratische Terminologie zu bestehen!)
Es ist keine Liste. Da Sie einem Skalar zuweisen, ist es der Komma-Operator - wertet die linke Seite aus, wertet die rechte Seite aus, gibt die rechte Seite zurück und wird von links nach rechts aufgelöst. %code% wird %code% :)
seinEs ist eine Frage der Terminologie und der Perspektive. Terminologie ist hier schwierig, weil Sie eine Liste im Quelltext schreiben, eine Liste von Werten zurückgeben oder etwas im Listenkontext auswerten können. Und das Wort "list" bedeutet in jedem Fall etwas anderes!
Technisch gesehen kann eine Liste nicht im skalaren Kontext existieren, weil Perl (der Interpreter) keine Liste von Werten für Dinge wie diese erstellt:
%Vor% Wenn pedantisch genau ist, wird dies als das Verhalten des Komma-Operators im skalaren Kontext erklärt. In ähnlicher Weise ist %code% so definiert, dass das letzte Element im skalaren Kontext zurückgegeben wird, sodass auch hier keine Liste vorhanden ist:
In beiden Fällen (und bei allen anderen Operatorbeispielen, die wir aufbringen könnten) sagen wir, dass der Interpreter keine Werteliste erstellt . Das ist ein Implementierungsdetail. Es gibt keinen Grund, dass Perl nicht eine Liste von Werten erstellen und alle bis auf die letzte wegwerfen kann; es wählt einfach nicht.
Perl die Sprache ist abstrakt. Auf Quellcodeebene ist %code% eine Liste. Sie können diese Liste in einem Ausdruck verwenden, der einen skalaren Kontext enthält. Aus dieser Perspektive kann eine Liste im skalaren Kontext existieren.
Am Ende ist es eine Wahl zwischen mentalen Modellen, wie [Pp] erl funktioniert. Das Modell "Eine Liste im Skalarkontext gibt den letzten Wert zurück" ist etwas ungenau, aber einfacher zu grok. Soweit ich weiß, gibt es keine Fälle in denen es funktional falsch ist. Das Modell "Es gibt keine Liste im skalaren Kontext" ist genauer, aber schwieriger zu bearbeiten, da Sie das Verhalten jedes Operators im skalaren Kontext berücksichtigen müssen.
Und das liegt daran, dass %code% erläutert die obige Zeile wie folgt (Hervorhebung hinzugefügt):
Da Sie einem Skalar zuweisen, ist die rechte Seite skalar Kontext. Der Komma-Operator (ja, es ist ein Operator!) Im skalaren Kontext wertet seine linke Seite aus, verwirft das Ergebnis und wertet es aus Es ist rechts und gibt das Ergebnis zurück. In der Tat, das list-lookalike weist %code% den am weitesten rechts liegenden Wert zu. Viele Leute vermasseln Sie das, weil sie ein list-lookalike auswählen, dessen letztes Element ist auch die Anzahl, die sie erwarten:
%Vor%
Was ich darunter verstehe, ist, dass es keine Liste im skalaren Kontext gibt.
ikegami behauptet jedoch, dass es " Ergebnis [s] in einem Listenoperator, so dass ist ein Listenliteral .
Also, ist es eine Liste oder nicht?
Es ist eine Frage der Terminologie und der Perspektive. Terminologie ist hier schwierig, weil Sie eine Liste im Quelltext schreiben, eine Liste von Werten zurückgeben oder etwas im Listenkontext auswerten können. Und das Wort "list" bedeutet in jedem Fall etwas anderes!
Technisch gesehen kann eine Liste nicht im skalaren Kontext existieren, weil Perl (der Interpreter) keine Liste von Werten für Dinge wie diese erstellt:
%Vor% Wenn pedantisch genau ist, wird dies als das Verhalten des Komma-Operators im skalaren Kontext erklärt. In ähnlicher Weise ist qw
so definiert, dass das letzte Element im skalaren Kontext zurückgegeben wird, sodass auch hier keine Liste vorhanden ist:
In beiden Fällen (und bei allen anderen Operatorbeispielen, die wir aufbringen könnten) sagen wir, dass der Interpreter keine Werteliste erstellt . Das ist ein Implementierungsdetail. Es gibt keinen Grund, dass Perl nicht eine Liste von Werten erstellen und alle bis auf die letzte wegwerfen kann; es wählt einfach nicht.
Perl die Sprache ist abstrakt. Auf Quellcodeebene ist ('a', 'b', 'c')
eine Liste. Sie können diese Liste in einem Ausdruck verwenden, der einen skalaren Kontext enthält. Aus dieser Perspektive kann eine Liste im skalaren Kontext existieren.
Am Ende ist es eine Wahl zwischen mentalen Modellen, wie [Pp] erl funktioniert. Das Modell "Eine Liste im Skalarkontext gibt den letzten Wert zurück" ist etwas ungenau, aber einfacher zu grok. Soweit ich weiß, gibt es keine Fälle in denen es funktional falsch ist. Das Modell "Es gibt keine Liste im skalaren Kontext" ist genauer, aber schwieriger zu bearbeiten, da Sie das Verhalten jedes Operators im skalaren Kontext berücksichtigen müssen.
Tags und Links perl list scalar-context