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


UtilFaqSubForm edit

Titel Arrays: Allgemeines
Autor AlexanderBecker
Bereich FaqTypen
Tags
Topic revision: r11 - 2008-02-18 - 00:30:32 - DaTa
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.