Arrays

  • Wie kann man Listen erzeugen?
  • Array löschen / leeren
  • Array in String umwandeln
  • Doppelte Einträge in Array töten
  • Wie kann man Teile einer Liste kopieren?
  • Wie kann man zwei Listen miteinander vergleichen?
  • Wie kann man eine oder mehrere Liste in eine Subroutine übergeben?
  • letztes Element ausgeben
  • Schleife über alle Indizies

    Wie kann man Listen erzeugen?

    Hier einige Beispiele zum expliziten Anlegen von Listen:

    my @list;
    my @list2 = (); # leere Liste
    my @list3 = ('item1', 'item2', $item3);
    my @list4 = qw(item1 item2 item3 item4);
    

    Falls man die Liste nicht deklarieren will und wenn man nicht mit use strict arbeitet, kann man Listen auch implizit anlegen:

    $list5[4] = 'item4';
    @list6[4,5] = (1,2);
    

    Hier werden automatisch Listen angelegt, deren Elemente 0 bis 3 nicht definiert sind (=undef), also praktisch zu Beginn eine Lücke haben.


    Array löschen / leeren

    @array = ();
    

    Array in String umwandeln

    $subs{mainContent}= join"",substitute(@whatToPrint)
    
    oder:
    { local $"; $subs{mainContent} = "@{[substitute (@whatToPrint)]}";}
    

    Doppelte Einträge in Array töten

    %hash=();
    for(@array){$hash{$_}=1}
    @array=keys(%hash);
    
    
    Indexnummer beim durchlaufen eines Arrays mit foreach feststellen: a) foreach my $zeile ( @array ) { # ... Kein Zugriff auf Zeilenzahlen... $zeilenzahl++; # jetzt aber doch.... b) foreach my $index ( 0..$#array ) { # jetzt Zeilenzahlen... $array[$index] # Zugriff auf den aktuellen Slot....


    Wie kann man Teile einer Liste kopieren?

      my @newList = @list[4..20, 30];
      my ($firstElement, @restOfList) = @list;
      my (@bigList) = (@smallList1, @smallList2);
      my @reverseList = reverse (@list);
    

    Wie kann man zwei Listen miteinander vergleichen?

    Wenn es sich um Listen handelt, die nicht allzuviele Elemente enthalten, funktioniert folgender Ansatz recht gut:

    if ("@list1" eq "@list2){
      print ("same\n");
    }
    else {
      print ("not the same\n");
    }
    

    Die Listen 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 Listen vergleichen will, könnte man folgende Möglichkeit wählen:

    my $difference = "";
    
    if ($#list1 eq $#list2){ # vergleiche Anzahl an Elementen
      for my $i (0.. $#list1){
        if ($list1[$i] ne $list2[$i]){ # vergleiche einzelne Elemente
          $difference = "nicht";
          last; # ueberspringe die restlichen Elemente
        }
      }
    }
    else {
      $difference = "nicht";
    }
    print ("Listen sind $difference identisch\n");
    

    Wie kann man eine oder mehrere Liste in eine Subroutine übergeben?

    Indem man eine Listenreferenz darauf bildet, und die dann übergibt.

    my @liste = (1,2,3,4,5,6,7,8);
    my $listenReferenz = \@liste; # Referenz bilden
    &PrintListe($listenReferenz);
    
    sub PrintListe {
      my ($localListenReferenz) = @_; 
      my @localeListe = @$localListenReferenz; # dereferenzieren
    
      foreach (@localeListe){
        print $_, "\t";
      }
      
      print "\nOder direkt die Listenreferenz verarbeiten:\n";
      foreach (@$localListenReferenz){ # dereferenzierung hier
        print $_, "\t";
      }  
    
      print "\nOder direkt über Listenreferenz-Indices verarbeiten:\n";
      foreach my $i (0..$#$localListenReferenz){
        print $localListenReferenz->[$i], "\t";
      }
      
    } # PrintListe
    

    Und nun mit mehreren Listen:

    my @liste1 = (1,2,3,4,5,6,7,8);
    my @liste2 = (9,10,11,12);
    my $listenReferenz1 = \@liste1; # Referenz bilden
    &PrintListen($listenReferenz1, \@liste2);
    
    sub PrintListen {
      my ($localListenReferenz1, $localListenReferenz2) = @_; 
      my @localeListe = @$localListenReferenz; # dereferenzieren
    
      foreach (@localeListe, @$localListenReferenz){
        print $_, "\t";
      }
      
    } # PrintListe
    

    letztes Element ausgeben

    my @zahlen = 1 .. 10;
    print "die letzte zahl ist die $zahlen[-1]\n";
    
    #Ausgabe:
    #die letzte zahl ist die 10
    

    Schleife über alle Indizies

    for my $cnt ( 0 .. $#array ) { ...