Arrays - Allgemeine Fragen
Inhalt:
Array löschen / leeren
@array = ();
wenn man
UseStrict verwendet, braucht man das aber meist nicht.
Wie kann man Arrays erzeugen?
Hier einige Beispiele zum expliziten Anlegen von Arrays:
my @array;
my @array2 = (); # leeres Array aus leerer Liste
my @array3 = ('item1', 'item2', $item3);
my @array4 = qw(item1 item2 item3 item4);
Falls man das Array nicht deklarieren will und wenn man nicht mit use strict arbeitet, kann man Arrays auch implizit anlegen:
$array5[4] = 'item4';
@array6[4,5] = (1,2);
Hier werden automatisch Arrays angelegt, deren Elemente 0 bis 3 nicht definiert sind (= undef), also praktisch zu Beginn eine Lücke haben.
Array in String umwandeln
$subs{mainContent} = join "", @array;
oder:
{ local $"; $subs{mainContent} = "@array";}
Doppelte Einträge aus Array entfernen
%hash = ();
for (@array) { $hash{$_} = 1 }
@array = keys(%hash);
Dabei geht allerdings die Reihenfolge des Arrays verloren.
Weitere Methoden siehe
perldoc -f duplicate.
Wie kann man Teile eines Arrays kopieren?
my @newList = @list[4..20, 30];
my ($firstElement, @restOfList) = @list;
my (@bigList) = (@smallList1, @smallList2);
my @reverseList = reverse (@list);
Wie kann man zwei Arrays vergleichen?
Wenn es sich um Arrays handelt, die nicht allzuviele Elemente enthalten, und wenn diese Elemente keine Leerzeichen haben, funktioniert folgender Ansatz recht gut:
if ("@list1" eq "@list2") {
print ("same\n");
} else {
print ("not the same\n");
}
Die Arrays werden zu einem String verarbeitet, wobei die einzelnen Elemente mit einem Leerzeichen zusammengefügt werden. Und diese beiden Strings werden dann verglichen.
Wenn man größere Arrays vergleichen will, könnte man folgende Möglichkeit wählen:
my $difference = "";
if ($#array1 eq $#array2){ # vergleiche Anzahl an Elementen
for my $i (0.. $#array1){
if ($array1[$i] ne $array2[$i]){ # vergleiche einzelne Elemente
$difference = " nicht";
last; # ueberspringe die restlichen Elemente
}
}
} else {
$difference = " nicht";
}
print ("Listen sind$difference identisch\n");
Letztes Element eines Arrays ausgeben
my @zahlen = 1 .. 10;
print "die letzte zahl ist die $zahlen[-1]\n";
# Ausgabe:
# die letzte zahl ist die 10
Schleife über alle Indizes
for my $cnt ( 0 .. $#array ) { ... }
Wie kann man ein oder mehrere Arrays an eine Subroutine übergeben?
Indem man eine Referenz darauf bildet, und die dann übergibt.
my @array = (1,2,3,4,5,6,7,8);
my $arrayReferenz = \@array; # Referenz bilden
PrintArray ($arrayReferenz);
sub PrintArray {
my ($lokaleArrayReferenz) = @_;
my @lokalesArray = @$lokaleArrayReferenz; # dereferenzieren
foreach (@lokalesArray){
print $_, "\t";
}
print "\nOder direkt die Listenreferenz verarbeiten:\n";
foreach (@$lokaleArrayReferenz){ # Dereferenzierung hier
print $_, "\t";
}
print "\nOder direkt über Indizes der Referenz verarbeiten:\n";
foreach my $i (0..$#$lokaleArrayReferenz){
print $lokaleArrayReferenz->[$i], "\t";
}
} # PrintArray
Und nun mit mehreren Listen:
my @array1 = (1,2,3,4,5,6,7,8);
my @array2 = (9,10,11,12);
my $arrayReferenz1 = \@array; # Referenz bilden
PrintArrays ($arrayReferenz1, \@array2);
sub PrintArrays {
my ($lokaleArrayReferenz1, $lokaleArrayReferenz2) = @_;
my @lokalesArray = @$lokaleArrayReferenz1; # dereferenzieren
foreach (@lokalesArray, @$lokaleArrayReferenz2){
print $_, "\t";
}
} # PrintArrays
Wie kann man das letzte Element eines Arrays entfernen
Mit der Funktion pop
my @array = (2,4,6,8,10);
pop @array;
print @array;
Wie kann man das erste Element eines Arrays entfernen
Mit der Funktion shift
my @array = (2,4,6,8,10);
shift @array;
print @array;
Wie kann man ein Element aus einem Array herausschneiden
Mit der Funktion splice
my @array = (2,4,6,8,10);
splice(@array, 2, 2);
print @array;
Schneidet ab dem 2 Element, 2 weitere Elemente heraus.
Ausgabe: 2410
Wie kann man ein Element an den Anfang eines Arrays hinzufügen
Mit der Funktion unshift
my @array = (2,4,6,8,10);
unshift(@array, 1);
print @array;
Wie kann man ein Element mitten im Array ändern
Auch mit der Funktion splice.
my @array = (2,4,6,8,10);
splice(@array, 2, 1, "wiki");
print @array;
Nun ist aus der 6 im Array ein "wiki" geworden.
Wie sortiert man ein Array nach irgendwas
Natürlich mit sort.
Nach dem Zahlenwert sortieren
@sorted = sort { $a <=> $b } @array;
Lexikalisch sortieren
@sorted = sort @array; # bzw.
@sorted = sort { $a cmp $b } @array
Nach etwas speziellem sortieren
Angenommen man hat eine Liste mit vielen Objekten, und will nachdem sortieren, was get_date liefert,
das könnte man nun so machen:
@sorted = sort { $a->get_date cmp $b->get_date } @objekte
Das führt aber dazu, dass get_date sehr oft aufgerufen wird, da Sortieren eine vergleichsintensive Aufgabe ist, und Funktionsaufrufe kosten Zeit.
Lösung: Decorate, Sort, Undecorate, das ganze dann mit der Schwartzschen Transformation:
@sorted = map { $_->[1] }
sort { $a->[0] cmp $b->[0] }
map { [$_->get_date, $_] } @objekte
--
AlexanderBecker - 17 Aug 2003 - Arrays
Kommentare
siehe hier.
Auch hilfreich zu Arrays:
http://wiki.perl-community.de/pub/User/TinaMueller/perlintro_de.html
Und hier gibt's ein paar nützliche
TextFormatierungsRegeln?.
--
TinaMueller - 18 Aug 2003
Tinas Vorschlaege und noch einiges mehr eingebaut
--
HaraldBongartz - 18 Aug 2003
Fehler in "Wie kann man Teile eines Arrays kopieren" behoben
--
AlexanderBecker - 18 Aug 2003