it-swarm.com.de

Perl-Array vs. Liste

Ich habe zwei Datenstrukturen in Perl:

Eine Anordnung:

my @array2 = ( "1", "2", "3");

for $elem (@array2) {
    print $elem."\n";
}

Geben Sie mir folgende Ausgabe:

1
2
3

Und eine Liste:

my @array = [ "1", "2", "3"];                                            

for $elem (@array) {
    print $elem."\n";
}

Geben Sie die folgende Ausgabe:

ARRAY(0x9c90818)

Natürlich möchte ich in beiden Fällen über die Elemente iterieren, aber warum gibt mir die zweite Lösung nur den Hinweis auf dieses Array?

37
Marcin Cylke

Listen in Perl sind keine Datenstrukturen, sondern Positionen im Quellcode, die durch den Kontext um sie herum bestimmt werden. Listen sind im Wesentlichen die vorübergehenden Strukturen, die Perl zum Verschieben von Daten verwendet. Sie interagieren mit ihnen mit der gesamten Perl-Syntax, können jedoch nicht als Datentyp mit ihnen arbeiten. Der Datentyp, der einer Liste am nächsten ist, ist ein Array.

my @var    =    (1, 2, 3);  # parens needed for precedence, they do not create a list
   ^ an array    ^ a list

say 1, 2, 3;
    ^ a list

say @var;
    ^ a list (of one array, which will expand into 3 values before `say` is called)

Wenn Sie [1, 2, 3] schreiben, erstellen Sie eine Skalar-Array-Referenz. Diese Arrayreferenz wird mit der Liste 1, 2, 3 initialisiert und entspricht der Erstellung eines benannten Arrays und einer Referenz darauf:

[1, 2, 3]   ~~   do {my @x = (1, 2, 3); \@x}

Da das [...]-Konstrukt einen Skalar erstellt, sollten Sie ihn in einem Skalar halten:

my $array = [1, 2, 3];                                            

for my $elem (@$array) {   # lexical loop variable
    print $elem."\n";
}

Da Sie das gesamte Array und nicht nur die Referenz bearbeiten möchten, platzieren Sie einen @ vor dem $array, der die gespeicherte Arrayreferenz dereferenzen.

78
Eric Strom

Die eckigen Klammern werden zum Erstellen eines anonymen Arrays verwendet. Bei der Auswertung wird ein Verweis auf dieses Array zurückgegeben, nicht die tatsächlichen Arraywerte.

Klammern haben keine solche verborgene Eigenschaft, sondern überschreiben einfach Vorrang innere Ausdrücke, ähnlich wie in Mathe. Zum Beispiel:

my @array = 1,2,3;

Wird eigentlich so bewertet:

my @array = 1;
2,3; # causes the warning "Useless use of constant in void context"

weil der =-Operator eine höhere Priorität hat als die Kommas. Um dies zu umgehen, verwenden wir bei der Zuweisung von Arrays Klammern wie:

my @array = (1,2,3);

Ihr Beispiel:

my @array = [1,2,3];

ist etwas wie das zu sagen:

my @tmp = (1,2,3);
my @array = \@tmp;

Hier wird mit \ eine Referenz auf das @tmp-Array erstellt.

31
TLP

Die eckigen Klammern erstellen ein anonymes Array, füllen das Array mit dem Inhalt der Klammern auf und geben einen Verweis auf dieses Array zurück. Mit anderen Worten,

[ "1", "2", "3" ]

ist im Grunde das Gleiche wie

do { my @anon = ("1", "2", "3"); \@anon }

So sollte der Code aussehen

my $array_ref = [ "1", "2", "3" ];

for (@$array_ref) {  # Short for @{ $array_ref }
    print "$_\n";
}

oder

my @array_of_refs = ([ "1", "2", "3" ]);

for my $array_ref (@array_of_refs) {
    for (@$array_ref) {
        print "$_\n";
    }
}
7
ikegami

Wenn Sie weitere Erläuterungen wünschen, lesen Sie die entsprechende Dokumentation .

Sie können einige Dinge zu Illustrationszwecken versuchen:

#!Perl -lw # -l appends a \n to each print, -w enables warnings
use strict;
my $aryref = [1 .. 5];
print for $aryref;    # Prints the stringified reference - not what you want
print for @$aryref;   # Dereferencing it lets you access the array
my @ary = $aryref;    # Probably not what you want
print for @ary;       # Stringified reference again
print for @{$ary[0]}; # Dereference the first array element (which holds the ref)
3
Lumi

@array = ("1", "2", "3"); Hier ist 1,2,3 das Element der @array-Variablen. Für ex. $ array [0] ist 1, $ array [1] ist 2 und $ array [2] ist 3. 

@array = ["1", "2", "3"]; Perl verwendet anonyme Array-Referenzen, die [] verwenden. Daher wird hier grundsätzlich nur ein Element gespeichert, das Sie speichern. Dies ist die Referenz eines Arrays ["1", "2", "3"] auf das @array Variable. für ex $ -Array [0] ist "ARRAY (0x9c90818)"
Während des Druckens werden Ihnen daher die Referenzen angezeigt. 

0
Sandeep_black

In Perl sind Arrays und Listen im Wesentlichen dasselbe, aber Ihr zweites Beispiel verwendet keine. Rechteckige Klammern umgeben ein Array reference (ein Skalarwert), und einem Array "Skalar zuweisen" mit etwas wie my @array = $scalar entspricht my @array = ($scalar). Daher ist das einzige Element von @array in Ihrem zweiten Beispiel eine Arrayreferenz.

0
jwodder