Gute Frage - hier sind einige Unterschiede:
$a[0] = localtime; print @a; # this prints: Tue Nov 1 18:51:13 2011
@a[0] = localtime; print @a; # this prints the amount of seconds, e.g. 13
$a[0] = grep{}, qw(6 2 8); print @a; # this prints: 3
@a[0] = grep{}, qw(6 2 8); print @a; # this prints: 6
$a[0] = reverse ("a", "b"); print @a; # this prints: ba
@a[0] = reverse ("a", "b"); print @a; # this prints: b
$a[0] = ("a", "b"); print @a; # this prints: b
@a[0] = ("a", "b"); print @a; # this prints: a
Es spielt keine Rolle, ob der Slice [1]
. Sie können weitere Beispiele erstellen, indem Sie Funktionen finden, die unterschiedliche Ergebnisse liefern, wenn sie in verschiedenen Kontexten ausgewertet werden.
Erläuterung des letzten (4.) Beispiels:
Die $
en $a[0]
erzeugt einen skalaren Kontext. Der Kontext beeinflusst die Arbeitsweise des Komma-Operators und führt zu unterschiedlichen Ergebnissen:
" Das binäre "," ist der Komma-Operator. Im skalaren Kontext wertet er sein linkes Argument aus, wirft diesen Wert weg, wertet dann sein rechtes Argument aus und gibt diesen Wert zurück. "
http://perldoc.perl.org/perlop.html#Comma-Operator
Daraus folgt: b
Um die Zeile zu verstehen, die mit beginnt: @a[0]
berücksichtigen:
($a, $b, $c) = ("a", "b", "c", "d"); # here the "d" is discarded
print $a, $b, $c; # this prints: abc
($a, $b) = ("a", "b", "c"); # here the "c" is discarded
($a) = ("a", "b"); # here the "b" is discarded
($a[0]) = ("a", "b"); # here the "b" is discarded
Es scheint, dass die Klammern am Anfang der Zeile einen Listenkontext erzeugen. Dies ist ziemlich genau das, was es bei: http://docstore.mik.ua/orelly/perl4/prog/ch02_07.htm " Die Zuweisung an eine Liste von Skalaren liefert auch einen Listenkontext auf der rechten Seite, selbst wenn die Liste nur ein Element enthält "
@
am Anfang einer Zeile erzeugt ebenfalls einen Listenkontext:
@a[0] = ("a", "b")
bedeutet, dass das RHS auf die gleiche Weise wie oben ausgewertet wird, d. h. das "b" wird verworfen.