Kommen wir nun zu dem Thema was C-Programmierer als dynamisches Array verstehen
dürften. Nur das in Perl ohne umständlich Speicher-Allokationen (calloc,
realloc) vor sich geht sondern mit einfachen Funktionen wie z.B. pop und
push.
push
Mit push können wir eine Element oder mehrere Elemente an das Ende unseres Arrays
hängen. Oder auch ein Array an ein anderes Array hängen......
#!/usr/bin/perl -w
@werte = (1..10); #Werte von 1-10
$zahl = 4;
@weitere_werte = (20..30); #Werte von 20-30
print "Demonstrationsprogramm zu push\n\n";
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
push (@werte , 15); #Wir hängen die Zahl 15 hinten an
print "Nun sind " . ($#werte+1) . " in der Liste\n";
push (@werte, 17, 18, 19);
#Es funktioniert natürlich auch mit mehreren Werten
print "Nun sind es " . ($#werte+1) . "\n";
push (@werte, $zahl); #So gehts natürlich auch
print "And now there are " . ($#werte+1) . " elements in the list\n";
push (@werte, @weitere_werte); #Jetzt hängen wir ein ganzes Array hinten dran
print "Zum Schluss haben wir folgende " . ($#werte+1) . " in der Liste : \n";
print "@werte" , "\n";
Ich denke mal das Programm ist selbsterklärend. Neu wird für Ihnen diese Schreibweise
sein.......
print "@werte" , "\n";
Wenn wir das Array in doppelt Hochkommata stellen werden die einzelnen Werte des
Array mit einem Leerzeichen dazwischen ausgegeben.
Eine weitere Möglichkeit ein Array zu vergrößern haben sie übrigens mit der
Standardvariablen $#name. Der Nachteil ist aber das die Werte zu Beginn noch
undefiniert sind und sie dies überprüfen müssen um Fehler zu vermeiden...
#!/usr/bin/perl -w
@werte = (0);
$#werte = 5; #Wir vergrössern das Array auf 5 Elemente
foreach (@werte)
{
if(defined $_) #ist defined=definiert oder undefined=undefiniert
{
next;
}
else
{
$_ = 0;
}
}
print "@werte" , "\n";
pop
Mit der Funktion pop können wir das letzte Element eines Array entfernen......
#!/usr/bin/perl -w
@werte = (1..10); #Werte von 1-10
print "Demonstrationsprogramm zu pop\n\n";
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
pop @werte; #Wir entfernen das letzte Element des Arrays
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
$delete = pop @werte;
print "Das Element mit dem Wert " . $delete .
" wurde aus dem Array entfernt\n";
print "Somit sind noch folgende " . ($#werte+1) .
" Werte in dem Array : " . "@werte" . "\n";
unshift und shift
Mit der Funktion shift können wir das erste Element eines Arrays entfernen und mit
unshift können wir eines oder mehrere Elemente an den Anfang eines Arrays
hinzufügen.......
#!/usr/bin/perl -w
@werte = (1..10); #Werte von 1-10
$zahl=99;
print "Demonstrationsprogramm zu shift und unshift\n\n";
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
print "@werte" , "\n";
shift @werte; #Wir entfernen das erste Element des Arrays
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
print "@werte" , "\n";
unshift (@werte, 666); #Wir fügen einen Wert ganz am Anfang hinzu
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
print "@werte" , "\n";
unshift (@werte, $zahl, 111, 222); #Geht auch so
print "Es sind " . ($#werte+1) . " Elemente in der Liste\n";
print "@werte" , "\n"
So nun kennen wir Möglichkeiten wie wir am Anfang und Ende eines Arrays Werte
hinzufügen oder entfernen können. Nun fehlt uns noch, sie werden es schon ahnen, Arrays irgendwo aus der Mitte hinzufügen bzw. entfernen zu können. Und Perl wäre nicht Perl wenn es dazu keine Funktion gäbe.
Eine häufige Verwendung von shift ist häufig in folgender Form zu sehen...
$arg = shift;
Diese Schreibweise ist nicht zu erraten wenn man sie nicht kennt. Sie gleichwertig zu...
$arg = shift @_;
...und somit auch gleichwertig zu...
$arg = shift @ARGV;
Damit sind wir in der lage die einzelnen Parameter der Kommandozeile auszulesen...
#!/usr/bin/perl -w
if($arg=shift) { }
else{$arg = "kein Argument";}
if($arg2=shift){ }
else {$arg2 = "kein 2.Argument"; }
print "1.Argument: $arg \n2.Argument: $arg2\n";
Hier ein Beispiel um 2 Argumente aus der Kommandozeile auszulesen. An diesem Programm können
erkennen das ein weiterer shift - Aufruf das zweite Argument auswertet.
splice
Damit haben wir also nun die Möglichkeit zwischen den Array herumzuspielen. Es gilt
nur folgendes : Wenn sie drei Parameter angeben.....
splice (@array, 10, 2); #wir löschen $array[10] und $array[11]
...entfernen sie einen Bereich aus dem Array. Hier wäre die aus dem Array @array
ab dem Index 10 2 Elemente. Wenn sie ein neues Element hinzufügen wollen benötigen sie einen 4. Parameter der das/die neue(n) Element(e) ersetzt..............
splice (@array, 10 , 2, @neu);
Hiermit wird in dem Array @array 2 Elemente ab der 10. Indexposition durch die in
dem Array @neu stehenden ersetzt. Hierzu nun kleines Beispiel.......
#!/usr/bin/perl -w
@werte = (1..10); #Werte von 1-10
@neu = (66, 99); #Die neuen Werte
$zahl = 11;
print "@werte" , "\n";
splice(@werte, 4, 2, @neu); #Wir ersetzen 5 und 6 durch 66 und 99
print "@werte" , "\n";
@ausschneiden = splice (@werte, 2, 5);
print "Wir haben die Werte " . "@ausschneiden" . " ausgeschnitten\n";
print "@werte" , "\n";
splice (@werte, 2, 2, $zahl, 69); #So gehts auch
print "@werte" , "\n";
© 2001,2002 Jürgen Wolf
|