perl

Perl bietet viel bequeme Funktionen zur Bearbeitung von Zeichenketten. Die mächtigsten davon sind die sogenannten "regular expressions" (kennen wir schon ein wenig vom grep Befehl). Diesen regulären Ausdrücken wird aber ein eigenes Kapitel gewidmet. Hier behandeln wir nur die wichtigsten normalen Funktionen:
chomp($bla);
würde allfällige newline Zeichen am Ende des strings $bla entfernen. Wird kein string angegeben so wird chomp auf die Variable $_ angewendet.

zum verketten von strings verwenden wir den + Operator:
$bla="a b" + " buh";
der operator .= hängt einen string an einen bestehenden an:
$bla .= " bäh";
obiges wäre also das selbe wie $bla = $bla . " bäh";

weiters kann perl strings in andere substituieren:
$bla="mein name ist $hase /n";
oft hat man Eingabezeilen die aus mehreren Feldern bestehen die durch ein Zeichen getrennt sind die man aufteilen will
@bla=split(/:/);
würde den string aus $_ anhand der Doppelpunkte in einzelne Felder zerteilen und diese nacheinander im arry @bla ablegen. Ein anderes Beispiel:
($x,@rest)=split(/,/,"Anna,Berta,Christa");
würde die string konstante anhand der Beistriche zerlegen. In der Variablen $x steht dann "Anna" und im feld @rest sind 2 Einträge mit Berta und Christa.

das Gegenteil von split ist join:
print join(";",$x,@rest),""; 
würde die Elemente $x und alle Felder aus @rest mit Strichpunkt getrennt ausgeben.
$bla=substr("abcdef",2,3);
gibt 3 Zeichen aus dem string ab Position 2 zurück. in diesem Falle "cde".
$länge=length("abc");
berechnet die länge eines strings. hier 3.
print lc($bla);
lc wandelt die zeichenkette in lowercase um, uc in upper case.

ganz allgemein gibt es den tr/// operator (translate).
$bla =~ tr /x/u/ ;
würde alle x durch ein u ersetzten. (=~ ist der substitutions operator)
$bla =~ tr/A-Z/a-z/ ;
würde alle Grossbuchstaben durch Kleinbuchstaben ersetzten. Hinter das tr/// kann man noch einige Buchstaben schreiben die das Verhalten von tr verändern:
s ersätzt mehrfache Vorkommnisse des selben Buchstabens durch
c heisst "complimentary" und dreht die Menge der zu ersetzenden Zeichen um. d.h. der string enthält dann alle NICHT angeführten Zeichen.
d besagt: alle Zeichen löschen die nicht ersetzt wurden.
$bla =~ tr/a-z/*/s; 
obiges ersetzt alle Kleinbuchstaben durch * wobei mehrere hintereinandervorkommende Kleinbuchstaben durch nur einen * ersetzt werden.
$bla =~ tr/a-z/*/c; 
obiger ausdruck ersetzt alle Zeichen die keine Kleinbuchstaben sind durch einen *.
$bla =~ tr/0-9//cd; 
 
obiges würde alles das nicht eine Ziffer ist löschen (complimentary und delete).
$bla =~ tr/0-9+-*\////cd;
dieser Ausdruch würde auch noch + - * und / im string übriglassen. Im Suchmuster muss man hier ein \ vor die Sonderzeichen schreiben. Ansonsten würde das ja als Bereichsangabe verstanden werden und das / als Ende des Suchmusters interpretiert werden. Das \ vor dem Zeichen behebt die Spezialfunktion und sagt dass wir wirklich dieses Zeichen meinen.



EXERCISES:

* schreibe ein Filter das von STDIN liest und alle Grossbuchstaben in Kleinbuchstaben umwandelt.

* schreibe ein Filter das von STDIN liest und nur die darin enthaltenen Ziffernfolgen ausgibt. Sind mehrere Ziffernfolgen in einer Zeile so sollen diese durch einen Beistrich getrennt ausgegeben werden.

* schreibe ein Filter das, wenn man es mit cat /etc/passwd füttert, das home-Verzeichnis aller user ausgibt. (Das homeverzeichnis ist das letzte Feld im passwd file. Die Einträge im passwd file sind durch Doppelpunkte getrennt.)

REFERENCES:

man perlop
man perlfunc