Homepage Inspire-world | Forum
CGI/Perl Workshops Arbeiten mit Arrays

 Inhaltsverzeichnis/Workshops Übersichtsseite/Arbeiten mit Arrays
In diesem Workshop soll es um das Arbeiten mit Arrays gehen, Arrays kommen in Perl Scripten häufig vor und können in vielfältiger Form verarbeitet werden.

1. Einleitung

Ein Array wird in Perl mit einem vorangestellten @ definiert (z.B. @daten). Ein Array kann ohne weiteres überall dort angelegt werden wo es im Script benötigt wird. Will man ein leeres Array anlegen so schreibt man einfach @arrayname = ();

Ein Array enthält eine Liste von Werten. Auf diese Werte kann man über den Arrayindex zugreifen. Siehe Bild unterhalb. Allgemeiner Aufbau eines Arrays

Wenn das Array, nennen wir es @daten, die Werte aus obigen Beispiel enthalten soll sieht das so aus:
@daten = ('a','b','c','d','e');

Um nun auf die Elemente zuzugreifen notiert man dies so: $daten[2] = c da der Arrayindex von 0 beginnt.

Arrays können beliebig viele Elemente enthalten, die maximale Größe wird allein vom benutzten Server/Rechner bestimmt.

2. Andere Möglichkeiten Arrays darzustellen

Der Bereichsoperator:
Um ein Array anzulegen das alle Zahlen von 1 bis 100 enthält muss man keine ellenlange Arrayelementeliste tippen. Hierfür benutzt man den Bereichsoperator .. also @daten = (1 .. 100); und das Array enthält die Hundert Elemente.

Die qw Syntax:
Hat man Arrays die aus einzelnen Worten, z.B. Wochentagen oder Monatsnamen bestehen, kann man das ganze auch so notieren
@daten = qw(Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag );

Dies kann aber nur bei solchen Arrayeinträgen angewendet werden die aus einem Wort bestehen. Hat man ein Array aus mehreren Sätzen muss man so notieren:

@daten = ("Das ist der erste Satz.", "Dies ist der zweite Satz.");

Gemischte Daten:
Ein Array kann durchaus auch verschiedene Arten von Daten beinhalten.

@gemixte = (1, $wert, "Das ist ein Text mit mehreren Worten.");

Auch ist es möglich Arrays zu verschachteln.
@alledaten = (@daten, @anderedaten);
Die zwei Unterarrays werden dann zu einem Array @alledaten zusammengeführt.


2. Auf in die Praxis

Hier werde ich nun ein Praxisbezogenes Beispiel der Arrayverarbeitung darstellen. Aufgabenstellung soll sein das eine Datei in ein Array gelesen wird und dies per foreach Schleife zwei definierte Werte ausgeben soll.

Das Array aus der Datei "holen"

Öffnet man eine Datei so:
open (DATEI, "<$dateipfad/meintext.txt") or die "Datei kann nicht gelesen werden: $!\n";
flock (DATEI, 2);
@Array = <DATEI>;
close DATEI;
ergibt dies ein solches Array:


Die vier Zeilen der Datei sind nun die 4 Elemente des Gesamtarrays @Array, wollte man nun auf einer der Zeilen zugreifen müsste man dies so notieren:



Will man nun dieses Array mittels einer Schleife durchlaufen und darstellen ist der Ablauf folgender:

Das @Array (Grün) wird mittels einer foreach Schleife verarbeitet, dabei wird jede Zeile (Arrayelement) der Variablen $zeile (Rot) zugewiesen. chomp sorgt dafür das das der Zeilenumbruch \n am Zeilenende entfernt wird. Da aber nun jede Zeile noch mehrere Teilelemente enthält die durch eine Pipe | voneinander getrennt sind müssen diese noch aufgesplittet werden in einzelne Variablen. Dies geschieht in der Zeile:

($daten1,$daten2,$daten3,$daten4)= split(/\|/,$zeile;

print "$daten1 - $daten3\n"; gibt dann die Teile aus die mittels Split erzeugt wurden. Der Backslash vor der Pipe im Split ist nötig da die Pipe ein Metazeichen ist welches escapt werden muss, siehe Liste der Metazeichen

3. Weitere Möglichkeiten mit Arrays zu arbeiten

Das Ende eines Arrays finden
Will man die höchste Indexnummer eines Arrays herausfinden notiert man einfach $#arrayname

Beispiel:
@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);
Komplettes Script:
#!/usr/bin/perl

#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

print $#monate; # gibt 11 aus
Um alle Elemente des Arrays mittels einer for Schleife zu durchlaufen und auszugeben, notiert man den Code so:
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Januar
Februar
März
April
Mai
Juni
Juli
August
September
Oktober
November
Dezember

Dies zeigt auch gleich weitere Möglichkeiten auf. Ist man nämlich nur an einem Teil des Arrays interessiert, kann man durch die Anpassung der Zählvariable $i die Ausgabe beeinflussen.
for ($i=4; $i <=7; $i++) {
print "$monate[$i]<br>";
}
Ausgabe
Mai
Juni
Juli
August

4. Elemente eines Arrays manipulieren

  • push und pop = Elemente an das Listenende hinzufügen bzw. entfernen
  • shift und unshift = Elemente am Listenanfang hinzufügen bzw. entfernen
  • splice = Elemente irgendwo in der Liste einfügen bzw. entfernen

push, Elemente an das Listenende anfügen

Syntaxbeispiel
$neu = "Das waren alle Monate";
push(@monate , $neu);


Komplettes Beispielscript
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

$neu = "Das waren alle Monate";
push(@monate , $neu);

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Januar
Februar
...
Dezember
Das waren alle Monate


pop, Element am Listenende entfernen

Syntaxbeispiel
# $entferntes = Dezember
$entferntes = pop(@monate);


Komplettes Beispielscript
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

# $entferntes = Dezember
$entferntes = pop(@monate);

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Januar
Februar
...
November


shift, Element vom Listenanfang entfernen

Syntaxbeispiel
# $erstes = Januar
$erstes = shift (@monate);


Komplettes Beispielscript
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

# $erstes = Januar
$erstes = shift (@monate);

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Februar
...
November
Dezember


unshift, Element an Listenanfang anfügen
unshift braucht zwei Argumente, die zu ändernde Liste und die die angefügt werden soll

Syntaxbeispiel
unshift (@monate , @wochentage);

Komplettes Beispielscript
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

@wochentage = qw(Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag);

print "Content-type: text/html\n\n";

unshift (@monate , @wochentage);

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Montag
Dienstag
Mittwoch
Donnerstag
Freitag
Samstag
Sonntag
Januar
...
Dezember

splice, Elemente irgendwo in der Liste einfügen bzw. entfernen
splice erwartet bis max. 4 Argumente:
  1. Das zu veränderde Array
  2. Den Offset, die Position ab der etwas hinzugefügt oder entfernt werden soll
  3. Die Anzahl der zu bearbeitenden Elemente, ist dies nicht angegeben ändert splice jedes Element vom Offset an.
  4. Die hinzuzufügenden Elemente, falls vorhanden
Syntaxbeispiel
splice (@monate, 1, 10);

Komplettes Beispielscript
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

splice (@monate, 1, 10);

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Januar
Dezember

Elemente mit splice in der Liste verändern
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

@monate = qw(Januar Februar März April Mai Juni Juli August September Oktober November Dezember);

print "Content-type: text/html\n\n";

splice (@monate, 7, 3, (9,10,11));

for ($i=0; $i <=$#monate; $i++) {
print "$monate[$i]<br>";
}
Ausgabe:
Januar
...
Juli
9
10
11
November
Dezember

» Weitere Praxisbezogene Beispiele hierzu ansehen »



 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Arbeiten mit Arrays
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!