Die Webseiten der Fachschaft Informatik am ERG Saalfeld


Listen erstellen, Zugriff auf Elemente und Listen-Operationen

Neben den Skalaren wie z.B. $x kennt Perl den Datentyp der Liste. In diesen Listen können Strings genauso wie auch Zahlen abgelegt werden. Listen heißen z.B. @zeilen oder @namen ..., erkennbar sind Listen am vorangestellten @.

Erstellen von Listen

Listen kann man z.B. erstellen (aber nicht nur!), indem man die Elemente angibt / aufzählt:

my @vornamen = ('anton', 'bert', 'caesar', 'detlef', 'emil');   # Inhalt der Liste sind 5 Strings
my @nachnamen = qw(kepler reinhold kopernikus brahe);   # Inhalt sind 4 Strings, durch qw (quote word) können die Anführungsstriche und Kommas weggelassen werden
my @primzahlen = (2, 7, 5, 11, 17, 23, 3);                      # Inhalt sind 7 Zahlen
my @gemischte_liste = ('07318', 'saalfeld', 'am lerchenbuehl', 17);   # hier sind Strings und Zahlen gemischt
my @leere_liste = ();                                                  # eine Liste ohne Elemente, also leer (Anzahl der Elemente ist 0)
my @undef_list;                                                         # die Liste ist nicht definiert, die Anzahl der Elemente ist 0


Zugriff auf die Listenelemente

Die Listenelemente werden der Reihe nach "durchnummeriert", wobei aber bei der Nummerierung mit 0 begonnen wird. D.h. in der Liste @vornamen ist 'anton' das 0. Element, 'bert' das 1. Element, 'caesar' das zweite Element usw. Das schreibt man so:

$zweites = $vornamen[2];

Das bedeutet, aus der Liste  @vornamen  wird das 2. Element, also 'caesar' in die (Skalar-)Variable  $zweites  gesteckt. Das bedeutet aber auch, der Zugriff auf ein Listenelement ist der Zugriff auf einen Skalar und damit ist  $vornamen[2]  eben auch eine Skalarvariable und hat konsequenterweise das Dollarzeichen, "obwohl" es sich auf die Liste @vornamen bezieht.

Merke: Skalare haben immer das $-Zeichen, (nur) Listen haben immer das @-Zeichen!

Beispiele:

my @vornamen = ('anton', 'bert', 'caesar', 'detlef', 'emil');
my $zweites = $vornamen[2];        # in $zweites steckt jetzt 'caesar'
$vornamen[1] = 'boris';                  # in der Liste sind jetzt 'anton', 'boris', 'caesar', 'detlef', 'emil'
$vornamen[0] = $zweites;              # in der Liste sind jetzt 'caesar', 'boris', 'caesar', 'detlef', 'emil'
# wir geben die Liste aus, jedes Element in einer Zeile
foreach my $element (@vornamen) {
  print $element, "\n";
}

my @nachnamen;
$nachnamen[0] = 'kepler';
$nachnamen[1] = 'reinhold';
$nachnamen[2] = 'kopernikus';
$nachnamen[3] = 'brahe';               # in der Liste sind jetzt 'kepler', 'reinhold', 'kopernikus', 'brahe'
$nachnamen[6] = 'regiomontanus';   # in der Liste sind jetzt 'kepler', 'reinhold', 'kopernikus', 'brahe', undef, undef, 'regiomontanus'
$nachnamen[2] = '';                      # in der Liste sind jetzt 'kepler', 'reinhold', '', 'brahe', undef, undef, 'regiomontanus'

 

Anzahl der Listenelemente bestimmen

Wenn man eine Liste einer Skalarvariablen zuweist, dann steht in der Skalarvariablen die Anzahl der Listenelemente. Beispiel:

$anzahl = @nachnamen;

Auf das letzte Beispiel mit @nachnamen bezogen würde in $anzahl eine 7 stehen. So wird auch in der Literatur und auf vielen Webseiten angegeben, dass man so die Anzahl ermittelt. Das geht aber nicht immer. Wenn man die Anzahl einer Liste direkt ausgeben will, ohne erst eine zusätzliche Variable zu verwenden, dann geht das nicht mit print @nachnamen; (ausprobieren ;-) ), sondern dafür gibt es die Anweisung skalar. Damit wäre Folgendes korrekt:  print skalar @nachnamen;. Damit empfehle ich wegen der besseren Lesbarkeit, die Anzahl der Listenelemente immer so zu bestimmen:

$anzahl = scalar @nachnamen;

 

Operationen mit Listen

  • push     = an eine Liste etwas anhängen
  • pop       = von einer Liste das letzte Element entfernen
  • shift    = von einer Liste das vorderste Element (0. Element) entfernen. Damit rutschen alle Elemente um eins nach vorn!
  • unshift   = einer Liste am Anfang (als 0.Element) hinzufügen. Damit rutschen alle Elemente um eins nach hinten!
  • reverse   = liefert eine Liste zurück, wobei die Reihenfolge vertauscht ist (das erste Element ist dann das letzte Element).
  • splice    = dient zum Entfernen, Hinzufügen und Austauschen von Teillisten - siehe Links.


Das folgende Programm soll die Nutzung der verschiedenen Operationen demonstrieren:

use strict;
use warnings;

my @liste1 = ('anton', 'bert', 'caesar', 'detlef', 'emil');     # in Liste1 sind jetzt 'anton', 'bert', 'caesar', 'detlef', 'emil'
push @liste1, 'fred';                                                 # in Liste1 sind jetzt 'anton', 'bert', 'caesar', 'detlef', 'emil', 'fred'

my $person = 'ilse';
my @liste2 = ();
push @liste2, 'gerda', 'hans';
push @liste1, @liste2, $person;                                 # in Liste1 sind jetzt 'anton', 'bert', 'caesar', 'detlef', 'emil', 'fred', 'gerda', 'hans', 'ilse'

pop @liste1;                                                          # in Liste1 sind jetzt 'anton', 'bert', 'caesar', 'detlef', 'emil', 'fred', 'gerda', 'hans'
$person = pop @liste1;                                            # in Liste1 sind jetzt 'anton', 'bert', 'caesar', 'detlef', 'emil', 'fred', 'gerda'

@liste2 = reverse @liste1;                                       # in Liste2 sind jetzt 'gerda', 'fred', 'emil', 'detlef', 'caesar', 'bert', 'anton'
@liste1 = @liste2;                                                   # in Liste1 sind jetzt 'gerda', 'fred', 'emil', 'detlef', 'caesar', 'bert', 'anton'

shift @liste1;                                                         # in Liste1 sind jetzt 'fred', 'emil', 'detlef', 'caesar', 'bert', 'anton'
shift @liste1;                                                         # in Liste1 sind jetzt 'emil', 'detlef', 'caesar', 'bert', 'anton'

push @liste1, $person;                                            # in Liste1 sind jetzt 'emil', 'detlef', 'caesar', 'bert', 'anton', 'hans'
push @liste1, $person;                                            # in Liste1 sind jetzt 'emil', 'detlef', 'caesar', 'bert', 'anton', 'hans', 'hans'

$person = shift @liste1;                                          # in Liste1 sind jetzt 'detlef', 'caesar', 'bert', 'anton', 'hans', 'hans'
push @liste1, $person;                                           # in Liste1 sind jetzt 'detlef', 'caesar', 'bert', 'anton', 'hans', 'hans', 'emil'

unshift @liste1, 'erasmus';                                      # in Liste1 sind jetzt 'erasmus', 'detlef', 'caesar', 'bert', 'anton', 'hans', 'hans', 'emil'
unshift @liste1, $person;                                       # in Liste1 sind jetzt 'emil', 'erasmus', 'detlef', 'caesar', 'bert', 'anton', 'hans', 'hans', 'emil'

# Ausgabe 1
foreach my $element (@liste1) {
  print $element, ' ';
}
print "\n";

# Ausgabe 2
print join(' ', @liste1);
print "\n";

__END__

 

Das sah dann bei mir so aus:

 

Aufgaben

  1. Bringen Sie das Programm zum Laufen.
  2. Ergänzen Sie das Programm, indem Sie die Anzahl der Listenelemente ausgeben lassen.
  3. Geben Sie das erste, das dritte und das letzte Element aus.
  4. Das 4. Element (also 'caesar') soll nun durch 'casimir' ersetzt werden. Geben Sie zur Kontrolle die Liste danach wieder aus.
  5. Worin unterscheiden sich die Ausgabe 1 und die Ausgabe 2? Falls Sie es nicht erkennen, ersetzen Sie jeweils das Leerzeichen durch einen Bindestrich und probieren es aus.

 

Weblinks

 

zurück


© ERG Saalfeld   -   Hans-Dietrich Kirmse     letztes Update: 4.03.2015