Was ist in Perl der Unterschied zwischen @array [1] und $ array [1]?

8

Ich habe Array-Slices studiert und sehe offen gesagt keinen Unterschied zwischen der Wahl von @array[1] und $array[1] . Ist da ein Unterschied?

%Vor%     
capser 05.10.2011, 07:00
quelle

5 Antworten

12

Dies ist eine FAQ .

Die beiden Formen funktionieren wahrscheinlich in vielen Kontexten gleich (aber nicht alle, wie Sie aus dem Beispiel in den FAQ sehen können), aber $array[1] drückt die Absicht deutlicher aus.

    
Keith Thompson 05.10.2011 07:05
quelle
11

$ und @ heißen sigils: hör was dir die sigils sagen

Wenn Sie $ sehen, handelt es sich um eine einzige Sache. Wenn Sie @ sehen, haben Sie eine Liste von Dingen.

@array[ 1 ] ist ein Slice, eine Liste mit ausgewählten Elementen aus der @array -Liste. Sie haben nur ein Element in dieses Segment eingefügt, das zweite Element von @array , aber es ist trotzdem eine Liste.

$array[ 1 ] ist das zweite Element der Liste, ein einzelner Wert, ein Skalar.

@hash{ 'one', 'two' } ist eine andere Art von Slice: diesmal haben wir einen Hashwert ( %hash ) aufgespalten und eine Liste mit Werten erhalten, die den Schlüsseln one und two entsprechen.

Wo ist der Unterschied? Obwohl der Unterschied gering ist, sollten Sie einzelne Elementscheiben vermeiden, wenn Sie einen einzelnen Wert wünschen. Beachten Sie, dass sich einzelne Element-Slices auf der rechten Seite eines Ausdrucks wie Skalare verhalten. Wenn sie sich jedoch auf der linken Seite eines Ausdrucks befinden, werden sie zu einer Listenzuweisung: Sie geben dem Ausdruck einen Listenkontext.

Wenn Sie sich immer noch nicht mit dem Unterschied zwischen Skalar- und Listenkontext auskennen, verwenden Sie bitte keine einzelnen Element-Slices, um unerwartete Ergebnisse in bestimmten Situationen zu vermeiden (z. B. bei Verwendung des Zeileneingabeoperators < > ) .

Überprüfen Sie die Dokumente und glückliche Perl.

    
Marco De Lellis 05.10.2011 08:12
quelle
4

Sie haben bereits Ihre Antwort von Keith und Marco: @ bedeutet Liste, $ bedeutet Skalar (Einzelwert). Ich habe mehr hinzuzufügen, das passt nicht in einen Kommentar.

Sie bemerken den Unterschied nicht, weil Sie eine Scheibe eines Elements verwenden. Versuchen Sie dies jedoch:

%Vor%

Hier sind einige Hinweise auf Ihren Code.

%Vor%

Es gibt wirklich keine Entschuldigung dafür, diese beiden nicht zu verwenden. Es gibt kaum einen Umstand, bei dem es besser oder einfacher ist, sie nicht zu benutzen. Dies gilt insbesondere, wenn Sie experimentieren und versuchen, Perl zu lernen.

Wenn Sie > Warnungen verwendet hätten, hätten Sie folgende zusätzliche Informationen erhalten:

%Vor%

Was im Grunde genau die Antwort ist, die Sie hier bekommen haben, obwohl sie in der Sprache des Perl-Compilers gesagt wurde.

Auch die Verwendung von print , wie Sie es tun, ist hart für die Augen. Nutzen Sie die Flexibilität von Perl:

%Vor%

Wie Sie sehen, werden dadurch Zeilenumbrüche auf WYSIWYG-Art gedruckt.

    
TLP 05.10.2011 14:42
quelle
0

Es gibt zwei Unterschiede:

  1. Das " 1 " wird im Listenkontext beim Array-Slice ( @foo[1] ), im skalaren Kontext bei der Array-Indizierung ( $foo[1] ) ausgewertet. Dies hat keine funktionale Wirkung.
  2. @foo[1] gibt eine Warnung.
ikegami 05.10.2011 18:51
quelle
0

Gute Frage - hier sind einige Unterschiede:

%Vor%

Es spielt keine Rolle, ob die Scheibe [1] ist. Sie können weitere Beispiele erstellen, indem Sie Funktionen finden, die bei der Auswertung in verschiedenen Kontexten zu unterschiedlichen Ergebnissen führen.

Erklärung des letzten (4.) Beispiels:
Der $ in $a[0] erzeugt einen skalaren Kontext. Der Kontext beeinflusst die Funktionsweise des Komma-Operators und erzeugt unterschiedliche Ergebnisse:

" Binary", "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. "
Ссылка

Daher: b

Zum Verständnis der Zeile beginnend mit: @a[0] in Erwägung ziehen:

%Vor%

Es scheint, dass runde Klammern am Anfang der Zeile einen Listenkontext erzeugen. Das ist ziemlich genau das, was es sagt: Ссылка " Die Zuweisung zu einer Liste von Skalaren bietet auch einen Listenkontext für die rechte Seite, auch wenn nur ein Element in der Liste vorhanden ist "

@ am Anfang einer Zeile erstellt auch einen Listenkontext:

@a[0] = ("a", "b") bedeutet, dass die RHS auf die gleiche Weise wie oben bewertet wird, d.h. das "b"

verworfen wird     
Literat 01.11.2011 19:14
quelle

Tags und Links