Textverarbeitung mit Perl

Perl Praxis 3

In dieser Übung lernen wir, Input aus Dateien einzulesen. D.h, wir werden in den nächsten Übungen immer die gleichen Dateien benutzen: für das Englische einen Auszug aus The Emerald City of Oz von Frank Baum (emerald.txt), für das Deutsche einen Auszug aus Die kleine Hexe von Otfried Preussler (hexe.txt).

Die Textauszüge sind relativ kurz, aber immerhin lang genug, dass man sehen (und verstehen) kann, wie die Programme funktionieren. Die Programme sind natürlich auch mit längeren Texten und Dokumenten verwendbar (machen wir dann natürlich auch).

In dieser Übung wird folgendes thematisiert: 1) Anwendung von Programm auf einen Dateinamen; 2) Konditionale (if-else-elsif), 3) Kontrolstrukturen (while); 4) Listen und Arrays.



Eine erste while Kontrollstruktur
#!/usr/local/bin/perl
#druckt einen Text versehen mit Zeilennummern 

#linenums.pl DATEI

while (<>) {
   print "$.: $_";
}

print "\n$. Zeilen insgesamt\n\n";

Der Diamond Operator erwartet eine Datei und geht sie einfach von Anfang bis Ende Zeile um Zeile durch. Die Variablen $_ und $. sind besondere Variablen. $_ enthält die Zeile, die gerade verarbeitet wird. $. enthält die Zeilennummer.
Übung 2.11. Kopiere oder tippe das Programm in einen Editor und führe es aus. Um die Datei aufzurufen, muss man nur den Namen nach dem Namen der Perl Datei angeben: perl linenums.pl emerald bzw. perl linenums.pl hexe
Übung 2.12. Ändere das Programm, so dass die Zeilennummer am Ende jeder Zeile ausgedruckt wird, statt am Anfang. Das sollte vielleicht so aussehen: ZEILE (1) (ohne Doppelpunkt!).
Übung 2.13. Ändere das Programm, so dass die Ausgabe in einer Datei mit dem Namen output.txt gespeichert wird.


Arbeiten mit Listen/Arrays
#!/usr/bin/perl
# first array

#define an array of heroes 
@heroes = qw(Sindbad Xena Hercules Modesty_Blaise Superman Spiderman);

#counter for each element of array
$n = 0;

# COUNTER - COUNTS EACH ROW
$count = 1;

# go through array and just print it
while ($heroes[$n]) {
	print "$count\t$heroes[$n]\n";
    $n++;  #place in array 
     $count++;  #line in array" 
}

Übung 3.5. Kopiere oder tippe das Programm in einen Editor und führe es aus.
Übung 3.6. Probiere, was passiert wenn das print statement als letztes im while-loop kommt. Warum sieht der Output jetzt anders aus?
Übung 3.7. Ändere das Programm, so dass es zusätzlich den kürzesten und den längsten Heldennamen ausgibt.


In den nächsten Übungen arbeiten wir wieder mit den bereitgestellten Texten (hexe.txt oder emerald.txt).

Wörterzählen
#!/usr/local/bin/perl
#words.pl DATEI

#zaehlt die Anzahl von Worten ein einer Datei

while (<>) {
    chop;
    foreach $w (split) {
        $words++;
    }        
}         
          
print "Diese Datei enthaelt $words Worte.\n";

Übung 3.10. Tippe das Programm ein und probiere es an einer Datei aus.
Übung 3.11. Lege das words.pl Programm zugrunde und schreibe eins, in dem ermittelt wird, wieviele Worte der Text im Durchschnitt pro Zeile enthät. Um das zu ermitteln, muss man die Anzahl der Worte durch die Anzahl der Zeilen dividieren ($words/$lines).
Übung 3.12. Schreibe noch ein weiteres Programm, das die durchschnittliche Anzahl von Buchstaben pro Wort ermittelt ($chars/$words). Hier kann man den praktischen length Operator einsetzen, um die Länge der Worte zu ermitteln


Ende