Drei wichtige Grundsätze sind nützlich, hier:
Kontext ist König. Die Auswertung Ihres Beispiels (1 + 1)
hängt vom Kontext ab.
$x = (1 + 1); # Scalar context. $x will equal 2. Parentheses do nothing here.
@y = (1 + 1); # List context. @y will contain one element: (2).
# Parens do nothing (see below), aside from following
# syntax conventions.
In einem skalaren Kontext gibt es nicht so etwas wie eine Liste. Versuchen Sie, das zu sehen, was erscheint, um eine Liste zu einer Skalarvariablen zu sein. Die Art und Weise, darüber nachzudenken, besteht darin, sich auf das Verhalten des Komma-Operators zu konzentrieren: Im skalaren Kontext wertet es sein linkes Argument aus, wirft diesen Wert weg, wertet dann sein rechtes Argument aus und gibt diesen Wert zurück. Im Listenkontext fügt der Kommaoperator beide Argumente in die Liste ein.
@arr = (12, 34, 56); # Right side returns a list.
$x = (12, 34, 56); # Right side returns 56. Also, we get warnings
# about 12 and 34 being used in void context.
$x = (@arr, 7); # Right side returns 7. And we get a warning
# about using an array in a void context.
Klammerung nicht schaffen Listen. Der Komma-Operator erstellt die Liste (vorausgesetzt, wir befinden uns im Listenkontext). Wenn Sie Listen in Perl-Code eingeben, werden die Klammern aus Gründen der Priorität benötigt - nicht aus Gründen der Listenerstellung. Ein paar Beispiele:
Die Klammern haben keine Wirkung: wir ein Array in skalare Kontext evaluieren, so dass die rechte Seite gibt die Array-Größe.
$x = (@arr);
Klammern sind nicht erforderlich, um eine Liste mit einem Element zu erstellen.
@arr = 33; # Works fine, with @arr equal to (33).
Aber Klammern sind mit mehreren Elementen erforderlich - aus Vorranggründen.
@arr = 12, 34, 56; # @arr equals (12). And we get warnings about using
# 34 and 56 in void context.
Ich mache mir Sorgen, dass ich versehentlich eine Ein-Element-Liste mit einem Ergebnis statt dem Ergebnis selbst einem Skalar zuweisen würde. Aber wenn ich die Antworten richtig lese, ist das eigentlich unmöglich, außer ich mache etwas wie $ x = @ {[1 + 1]}; Es scheint, dass das Zuweisen einer Liste zu einem Skalar anders ist als das Zuweisen eines Arrays zu einem Skalar. Was passiert, wenn Sie einem Skalar eine Liste zuweisen, die ein Array enthält? '$ x = (@list);' –
In einer Zuweisung bestimmt die linke Seite den Kontext, in dem die rechte Seite ausgewertet wird. Wenn Sie also ein Array einer skalaren Variablen zuweisen, wird das Array im skalaren Kontext ausgewertet. Ein Array, das im skalaren Kontext ausgewertet wird, gibt die Anzahl der Elemente im Array zurück. Beide Beispiele in Ihrem Kommentar fallen unter diese Kategorie. Beachten Sie auch, dass es sich hier um die Bewertung eines Arrays im skalaren Kontext handelt. Wir sprechen nicht über eine Liste im skalaren Kontext, da es keine Listen im skalaren Kontext gibt. – FMc
Ich denke, ich habe immer daran gedacht, dass Listen und Arrays grundsätzlich äquivalent und austauschbar sind, aber das sind sie nicht. –