2017-06-28 3 views
3

Wenn mit Listen in Skalarkontext arbeitet das letzte Element zurückgegeben:Warum Slicing-Element aus der Liste nicht zurückgeben Liste?

@l = qw/ a b c d /; 
print scalar (1, @l); # prints 4 

Das letzte Element der Liste ist @l, ist seine Länge in Skalarkontext 4

So das letzte Element @l ist.

Warum, wenn ich Slice mache, bekomme ich dieses Element nicht?

print ((1, @l)[1]); # prints 'a'. expect: abcd 

PS. Vielleicht sollte ich fragen: Warum ist das Plätten im ersten Beispiel nicht passiert?

Antwort

6

Es ist aufgrund der Unterschiede im Verhalten zwischen Listen- und Skalarkontext, und der Tatsache, dass scalar ist ein Operator und kein Unterprogrammaufruf. scalar kann nur einen einzigen Operanden verwenden. Wenn Sie also mehr als einen Parameter übergeben, werden diese in einen skalaren Kontext gestellt. Dies ist anders als bei gewöhnlichen Unterprogrammaufrufen, bei denen sich die Parameter immer im Listenkontext befinden.

In skalaren Kontext wertet der Komma-Operator seinen linken Operanden aus und verwirft ihn und wertet dann seinen rechten Operanden aus. So scalar(1, @l) wertet und verwirft 1 und wertet dann @l aus. Wie Sie sagen, dass 4 ist, weil @l vier Elemente haben

Eine Liste in Scheiben schneiden, wenig überraschend, erlegt Listenkontext, und in der Liste trennen Kontext Kommas, um die Elemente einer Liste und Arrays und Hashes abgeflacht ist.So (1, @l)[1] ist die gleiche wie (1, qw/ a b c d /)[1] die a ist

Perl-Array Operatoren wie push und pop verhalten sich in ähnlicher Weise. push @l, 1 würde nicht viel nutzen, wenn es sich genauso wie eine gewöhnliche Unterroutine verhält und auf push 'a', 'b', 'c', 'd', 1

+0

erweitert wird> Ein Listenausschnitt erzwingt Listenkontext. Danke –

4

In Ihrem ersten Beispiel erzwingen Sie skalaren Kontext mit scalar.
Im skalaren Inhalt wird , interpretiert als Skalar binärer Operator, der Argument der rechten Seite zurückgibt.

@l = qw/ a b c d /; 
@m = (1, @l); # (1,@l) is interpreted in list context 
print scalar(@l); # prints 4 
print scalar(@m); # prints 5 
print scalar('a',@l); # ('a',@l) is interpreted in scalar context 
         # prints scalar(@l) 
print scalar(@l,'a'); # (@l,'a') is interpreted in scalar context 
         # prints a 

perldoc -f scalar

Skalar EXPR
Forces EXPR in skalaren Kontext interpretiert werden und gibt den Wert von EXPR.

man perlop

Comma Operator
Binary "" ist der Komma-Operator. Im skalaren Kontext wertet es das linke Argument aus, verwirft diesen Wert, wertet dann sein richtiges Argument aus und gibt diesen Wert zurück. Das ist genau wie der Komma-Operator von C.
Im Listenkontext ist es nur das Listenargumenttrennzeichen und fügt beide Argumente in die Liste ein. Diese Argumente werden ebenfalls von links nach rechts ausgewertet.

Verwandte Themen