Gibt es eine Liste im skalaren Kontext?

8
%Vor%

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 $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:

%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?

    
Zaid 22.11.2011, 19:57
quelle

6 Antworten

8

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:

%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 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.

>     
Eric Strom 22.11.2011, 20:22
quelle
3

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!)

    
ruakh 22.11.2011 20:05
quelle
3

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.

    
ikegami 22.11.2011 23:03
quelle
2
___ answer8235148 ___

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.

    
___ qstnhdr ___ Gibt es eine Liste im skalaren Kontext? ___ answer8233297 ___

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.

>     
___ answer8233058 ___

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!)

    
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ answer82333001 ___

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% :)

sein     
___ tag123list ___ Liste kann sich beziehen auf: eine verkettete Liste (eine geordnete Menge von Knoten, die jeweils auf ihren Nachfolger verweisen) oder eine Form eines dynamischen Arrays. Um nicht für HTML-Listen verwendet zu werden, verwenden Sie stattdessen [html-lists]. ___ answer8234043 ___

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 %code% so definiert, dass das letzte Element im skalaren Kontext zurückgegeben wird, sodass auch hier keine Liste vorhanden ist:

%Vor%

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.

    
___ answer8239544 ___

Wenn Sie an Listen im skalaren Kontext glauben, klatschen Sie in Ihre Hände

    
___ tag123scalarcontext ___ hilf uns dieses Wiki zu bearbeiten ___ qstntxt ___
%Vor%

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?

    
___
Ry︁ 22.11.2011 20:01
quelle
2

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:

%Vor%

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.

    
Michael Carman 22.11.2011 21:27
quelle

Tags und Links