ein Kapitel zurück                                           ein Kapitel weiter

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";


ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf