Software-Engineering Martin Fabiani

Sitemap (Navigation ohne JavaScript)

Impressum: Martin Fabiani, Röderbergweg 104, D-60485 Frankfurt, Tel: +49 (69) 49084808, E-Mail: info (at) fabiani.net, USt-IdNr: DE217298609

Tips und Tricks zu Perl

Datenstrukturen

Listen/Arrays:

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.


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";
} # else

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
    } # if
  } # for
} # if
else {
  $difference = "nicht";
} # else
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";
  } # foreach
  
  print "\nOder direkt die Listenreferenz verarbeiten:\n";
  foreach (@$localListenReferenz){ # dereferenzierung hier
    print $_, "\t";
  } # foreach

  print "\nOder direkt über Listenreferenz-Indices verarbeiten:\n";
  foreach my $i (0..$#$localListenReferenz){
    print $localListenReferenz->[$i], "\t";
  } # foreach
  
} # 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";
  } # foreach
  
} # PrintListe

Siehe auch Einührung in Perl


Letztes Update dieser Seite: Tuesday, 27-Jun-2006 20:36:59 CEST