ein Kapitel zurück                                           ein Kapitel weiter

Zwei sehr nützlich und häufig eingesetzte Funktionen sind grep zum Suchen und sort zum Sortieren von Arrays oder Hashes.

Schauen wir uns doch zuerst die Funktion sort zum Sortieren an. Der Einsatz dieser Funktion sieht so aus....

@ARRAY_SORTIERT = sort(@ARRAY_UNSORTIERT);


Die Funktion sort sortiert die Einzelnen Elemente einer Liste lexikographisch, was genauso abläuft wie bei einem Lexikon. Was beim sortieren von Zahlen von Nachteil ist.
Warum sehen sie an diesem Programm........

#!/usr/bin/perl -w

@unsortiert = (2, 11, 55, 1234, 3, 6, 9);
@sortiert = sort(@unsortiert);

print "@sortiert" , "\n";


Die Zahlen werden anhand der Ziffernfolge sortiert. Somit wird zuerst nach der 1. Zahl sortiert. In unserem Beispiel kommt 11 vor 2 da diese Zahl mit 1 beginnt.

Ein weiteres Beispiel von sort mit Arrays von Zeichenketten......

#!/usr/bin/perl -w

@unsortiert = ("Zebra", "Gepard", "Baer", "Affe", "Aal");

@sortiert = sort(@unsortiert);

print "@sortiert" , "\n";


Und natürlich noch ein Beispiel eines Hash. Einmal nach Schlüssel und einmal nach Werten sortiert.......

#!/usr/bin/perl -w

%adressen = ("Name" => "D.J.",
                       "Wohnort" => "Palermo",
                       "Alter" => 66,
                       "Bemerkung" => "A good people");


#Geben sortiert nach Werten aus..............
foreach (sort { $adressen{$a} cmp $adressen{$b} } keys %adressen)
 {
   print $_ . " : " . $adressen{$_} . "\n";
 }

 print "\n";

#Sortiert nach Schlüsseln
foreach (sort keys %adressen)
 {
   print $_ . " : " . $adressen{$_} . "\n";
 }


Was passiert den hier............


foreach (sort { $adressen{$a} cmp $adressen{$b} } keys %adressen)  


Sieht kryptischer aus als es ist. Hier werden zwei 2 Werte ausgewertet. Der Perl-Interpreter ließt ja von rechts nach links. Also bei dem Hash %adressen wir holen uns die Schlüssel mit keys.
Der Wert wird in $adressen{$b} gelegt und der andere in $adressen{$a}
Die beiden werden nun miteinander verglichen und mit sort lexikographisch sortiert. Der Sortierte Wert steht jetzt in der Standartvariablen $_ und wird ausgegeben.

Die Variablen $a und $b sind übrigens weitere Standardvariablen die für das Sortieren verwendet werden. Folglich können wir diese beiden Standardvariablen auch mit Zahlen verwenden. Somit werden anders als in dem Beispiel oben die Zahlen der Grösse nach sortiert...

#!/usr/bin/perl -w

@unsortiert = (2, 11, 55, 1234, 3, 6, 9);
@sortiert = sort{$a <=> $b} @unsortiert ;

print "@sortiert" , "\n";


Sollten sie die Sortierung in umgekehrter Reihenfolge vornehmen wollen, also der grössere Wert zuerst, müssen sie nur die Standardvariablen $a und $b bei Ihrer Angabe umdrehen...

#!/usr/bin/perl -w

@unsortiert = (2, 11, 55, 1234, 3, 6, 9);
@sortiert = sort{$b <=> $a} @unsortiert ;

print "@sortiert" , "\n";


...oder....

#!/usr/bin/perl -w

@unsortiert = qw(America Zebra Aal Vogel Tor Feuer);
@sortiert = sort{$b cmp $a} @unsortiert ;

print "@sortiert" , "\n";



grep

Mit der Funktion grep filtern sie aus einer Liste alle Elemente heraus für die ein Ausdruck falsch ist. Hier der Syntax zu grep......


@liste = grep( AUSDRUCK, LISTE);


Mit grep durchschleifen wir also alle Elemente der Liste und Werten jedes Element mit einem gegebenen Begriff aus. Ist der Ausdruck wahr fügt grep das Element der sich daraus ergebenen Liste hinzu. Hier ein Beispiel für grep....

#!usr/bin/perl -w

@liste1 = (1..10);
@liste2 = qw(a b c d e a b c e f a a);
@temp = (0);

@temp = grep($_ %2, @liste1);     #alle ungeraden Zahlen in @temp
print @temp , "\n";

@temp = grep($_ ne "a", @liste2);  #alle Buchstaben außer 'a' in @temp
print @temp , "\n";


Die Funktion grep setzt also die Variable $_ zu dem aktuellen Listenwert und wertet diesen Ausdruck aus.

grep läßt sich auch im Skalaren Kontex aufrufen...

#!/usr/bin/perl -w

@files = <*.txt>;

@file = grep { -s > 1*1024} @files;

print join("\n" , @file)


In diesem Beispiel werden alle Textdateien mit der Endung *.txt und größer als 1024 Bytes ausgegeben. Ebenso läßt sich grep hervoragend mit dem Pattern Matching - Operator m// einsetzten...

#!/usr/bin/perl -w

@files = <>;

(@file) = grep { m/.*?(\/\*.*?\*\/).*$/ } @files;

print join("\n" , @file);


Mit diesem Programm können geben sie alle Zeilen aus, wo ein Text zwischen /* Text */ steht. Also Kommentare eines C Programm oder Headerdatei. Beispiel.....

/usr/bin/perl -w list.pl  /usr/include/stdio.h


...gibt alle Kommentare aus die in der Headerdatei stdio.h stehen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf