Kommentare

Transcrição

Kommentare
Musterlösung 4
14.11.2003
Namensliste 2
Lesen Sie die Namensliste von Übung 3 ein. Geben Sie die Namen so aus, dass
am Zeilenbeginn die Zeilennummer steht, dann der Vorname, gefolgt vom Nachnamen. Versuchen Sie alle Namensvarianten zu erfassen, z.B. auch mehrteilige
Namen und Doppelnamen.
Namensvarianten:
einfache Namen: s/ ( w+), ( w+)/$2 $1/;
ALBRECHT, Angelika
ALENCAR, Leonel
Umlaute : use locale;
BRÜNING, Ulrike
Mehrteilige Vornamen: s/ ( w+), ([ w - .]+)/$2 $1/;
BECK, Hans-Rainer
HANY BABU, M.T.
KAISER, Georg A.
HAUBOLD, Anne-Marie Friederike
Problem: unsaubere Formatierung
KLEINMANN, Achim, s/ ( w+), ([ w - .]+),?/$2 $1/;
teilweise Leerstelle hinter Vornamen Vorverarbeitung mit s/ s*$//g;
Mehrteilige Nachnamen: s/ (.+), ([ w - .]+),?/$2 $1/;
COUPER-KUHLEN, Elizabeth
DI LUZIO, Aldo
Formatieren Sie alle Namen so, dass nur der jeweils erste Buchstabe des Wortes großgeschrieben wird (bei Doppelnamen mit Bindestrich jeder Namensteil).
Leerzeilen sollen in der Ausgabe ignoriert werden.
einfache Nachnamen: s/ (.+), ([ w - .]+),?/$2
L u$1/;
Mehrteilige Nachnamen
spezieller Fall vor Normalfall abtesten
s/ ([
-,]+)([ -])(.+), ([ w - .]+),?/$4 L u$1$2 L u$3/;
s/ (.+), ([ w -.]+),?/$2 L u$1/;
Problem: Fehlermeldung bei wiederholter Anwendung von L u
Skopus mit E begrenzen
s/ ([
-,]+)([ -])(.+), ([ w - .]+),?/$4 L u$1 E$2 L u$3/;
Beispielprogramm:
#! /usr/local/bin/perl -w
use locale;
# erweitert \w auf Umlaute
$zaehler = 0;
while ($in=<>) {
chomp($in);
# Zaehler initialisieren
# zeilenweises Einlesen
# Newline loeschen
if ($in !~ /^\s*$/){
# Leerzeilen ignorieren
$zaehler++;
# Zaehler erhoehen
$in =~ s/\s*$//;
# schneidet ungewollte Leerzeichen am Zeilenende ab
# Spezieller Fall:
# Suche, Umstellung und Neuformatierung bei mehrteiligem Nachnamen
$in =~ s/^([^ \-,]+)([ -])(.+), ([\w\- .]+),?/$4 \L\u$1\E$2\L\u$3/;
# Normalfall:
# Suche, Umstellung und Neuformatierung bei einfachen Nachnamen
$in =~ s/^(.+), ([\w\- .]+),?/$2 \L\u$1/;
# Ausgabe:
print "$zaehler. $in\n";
}
}
Perl, Zinsmeister
2
Lösung 4
Kleiner Zusatz:
printf "%2d",$zaehler;
print ". $in\n";
# pretty print
Ausgabe:
1. Angelika Albrecht
2. Leonel Alencar
3. Ramin Assadollahi
4. Markus Bader
5. Dagmar Baumann
6. Josef Bayer
7. Hans-Rainer Beck
8. Wolfgang Benkewitz
9. Ellen Brandner
10. Walter Breu
11. Ulrike Brüning
12. Miriam Butt
13. Domanica Catino
Perl, Zinsmeister
3
Lösung 4