8 Stimmen

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

Ich habe studiert Array-Scheiben und offen gesagt sehe ich keinen Unterschied zwischen der Wahl @array[1] y $array[1] . Gibt es einen Unterschied?

#!/usr/bin/perl 
@array = (1,3);
print "\nPrinting out full array..\@array\n";
print "@array\n";
print "\n";
print "Printing out \@array[1]\n";
print "@array[1]\n";
print "Printing out \$array[1]\n";
print "$array[1]\n";
print "\n\n";

12voto

Keith Thompson Punkte 240701

Dies ist eine FAQ.

Die beiden Formen funktionieren in vielen Kontexten auf die gleiche Weise (aber nicht in allen, wie Sie aus dem Beispiel in den FAQ ersehen können), aber $array[1] drückt die Absicht deutlicher aus.

11voto

Marco De Lellis Punkte 1169

$ y @ werden Siegel genannt: höre, was dir die Siegel sagen

Wenn Sie sehen $ Sie haben es mit einer einzigen Sache zu tun. Wenn Sie sehen @ Sie haben 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 Slice gesetzt, 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 weitere Art von Slice: Diesmal haben wir einen Hash zerlegt ( %hash ), um eine Liste mit Werten zu erhalten, die den Schlüsseln entsprechen one y two .

Wo liegt der Unterschied? Auch wenn der Unterschied nur gering ist, sollten Sie Slices mit einzelnen Elementen vermeiden, wenn Sie einen einzelnen Wert benötigen. Denken Sie daran, dass sich Einzelelement-Slices auf der rechten Seite eines Ausdrucks wie Skalare verhalten, aber wenn sie auf der linken Seite eines Ausdrucks stehen, werden sie zu einer Listenzuweisung: Sie geben dem Ausdruck einen Listenkontext.

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

Lesen Sie die Dokumentation und viel Spaß mit Perl.

4voto

TLP Punkte 65295

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

Sie bemerken den Unterschied nicht, weil Sie nur einen Ausschnitt eines Elements verwenden. Versuchen Sie jedoch Folgendes:

use warnings;
use strict;
use v5.10; # to enable say

my @array = (1 .. 10);
say "@array[2 .. 4]"; # [2,3,4] == "3 4 5"
say "@array[1,4,7]";  #         == "2 5 8"

Hier sind einige Hinweise zu Ihrem Code.

use strict;
use warnings;

Es gibt wirklich keine Entschuldigung dafür, diese beiden nicht zu verwenden. Es gibt kaum eine Situation, in der es besser - oder einfacher - ist, sie nicht zu verwenden. Dies gilt besonders, wenn Sie experimentieren und versuchen, Perl zu lernen.

Wenn Sie hatte Wenn Sie Warnungen verwendet hätten, hätten Sie diese zusätzlichen Informationen erhalten:

Scalar value @array[1] better written as $array[1]

Das ist im Grunde genau die Antwort, die Sie hier erhalten haben, wenn auch in der knappen Sprache des Perl-Compilers.

Auch die Verwendung von print die Art und Weise, wie Sie es machen, ist anstrengend für die Augen. Nutzen Sie die Flexibilität von Perl:

#!/usr/bin/perl 
use strict;
use warnings;

my @array = (1 .. 10);
print "
Printing out full array..\@array
@array

Printing out \@array[1]
@array[1]
Printing out \$array[1]
$array[1]

";

Wie Sie sehen können, werden dadurch Zeilenumbrüche in einer WYSIWYG-Art ausgedruckt.

0voto

ikegami Punkte 340842

Es gibt zwei Unterschiede:

  1. Die " 1 "wird im Fall der Array-Slice im Listenkontext ausgewertet ( @foo[1] ), sondern im skalaren Kontext im Falle der Array-Indizierung ( $foo[1] ). Dies hat keine funktionellen Auswirkungen.
  2. @foo[1] gibt eine Warnung aus.

0voto

Literat Punkte 869

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X