22.11.2013 Aufrufe

Einführung in Perl Dateien, Verzeichnisse und Prozesse II select ...

Einführung in Perl Dateien, Verzeichnisse und Prozesse II select ...

Einführung in Perl Dateien, Verzeichnisse und Prozesse II select ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¤<br />

¥<br />

¦<br />

¤<br />

¥<br />

¥<br />

¤<br />

¤<br />

¤<br />

¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¥<br />

¥<br />

¥<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Perl</strong><br />

<strong>Dateien</strong>, <strong>Verzeichnisse</strong> <strong>und</strong> <strong>Prozesse</strong> <strong>II</strong><br />

Dateihandle<br />

- <strong>select</strong><br />

- ungepufferte Ausgabe<br />

- open, ergänzt<br />

- In-place Bearbeitung<br />

<strong>Dateien</strong> manipulieren<br />

- löschen<br />

- umbenennen<br />

<strong>Verzeichnisse</strong> manipulieren<br />

Sonstiges<br />

- Lookahead<br />

- Lookbeh<strong>in</strong>d<br />

Referenzen<br />

<strong>select</strong><br />

die Ausgabe von pr<strong>in</strong>t geht standardmäßig nach STDOUT<br />

(d.h. normalerweise auf den Bildschirm)<br />

Umleitung der Ausgabe durch explizites Dateihandle als erstes<br />

Argument von pr<strong>in</strong>t<br />

pr<strong>in</strong>t DH "bla bla n";<br />

<strong>select</strong> ändert Standardausgabe<br />

nach der Benutzung auf STDOUT zurücksetzen<br />

<strong>select</strong> OUT;<br />

pr<strong>in</strong>t ("$_\n");<br />

pr<strong>in</strong>tf ("%2d\.",$c);<br />

...<br />

<strong>select</strong> STDOUT;<br />

# neue Defaultausgabe<br />

# Ausgabe nach OUT<br />

# formatierte Ausgabe nach OUT<br />

# zurücksetzen auf alte Defaultausgabe<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 1<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 2<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

Autoflush<br />

#! /usr/local/b<strong>in</strong>/perl -w<br />

Autoflush - Bsp (1)<br />

standardmäßig wird die Ausgabe (bisher: pr<strong>in</strong>t, pr<strong>in</strong>tf)<br />

gepuffert<br />

– zeilenweise bei Bildschirmausgabe<br />

– blockweise andernfalls<br />

ist kodiert <strong>in</strong> <strong>in</strong>terner Variable $| (Defaultwert: 0)<br />

$| = 0; # Default 0: Pufferung auf Zeile oder Block<br />

# Wert 1: Flush nach jeder Pr<strong>in</strong>t-Anweisung<br />

pr<strong>in</strong>t "Wert von AUTOFLUSH: $|\n" ;<br />

# (zur Kontrolle)<br />

# Aufgabe: alle <strong>Dateien</strong> e<strong>in</strong>es <strong>Verzeichnisse</strong>s sollen bearbeitet werden<br />

$pfad ="/home/users7/z<strong>in</strong>smeis/Teach<strong>in</strong>g/<strong>Perl</strong>-03/"; # Verzeichnis<br />

opendir (VH, "$pfad") or die "Kann $pfad nicht oeffnen: $!";<br />

# wird geoeffnet<br />

auch $OUTPUT AUTOFLUSH oder $AUTOFLUSH<br />

alternative Ausgabe bei $| =1<br />

– erzw<strong>in</strong>gt Leeren des Puffers nach jedem pr<strong>in</strong>t, pr<strong>in</strong>tf<br />

foreach $date<strong>in</strong>ame (readdir VH) {<br />

$datei = "$pfad$date<strong>in</strong>ame";<br />

pr<strong>in</strong>t ".";<br />

&bearbeite_datei($datei);<br />

}<br />

# Aufruf der Date<strong>in</strong>amen<br />

# vollstaendige Adresse<br />

# Kontrollausgabe auf dem<br />

# Bildschirm, um Fortschreiten<br />

# anzuzeigen <strong>und</strong> Wartezeit zu verkuerzen<br />

# Bearbeitung der Datei <strong>in</strong> Subrout<strong>in</strong>e<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 3<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 4


¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¥<br />

¥<br />

¥<br />

¥<br />

¦<br />

¥<br />

¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¥<br />

¥<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

Autoflush - Bsp (2)<br />

wenn Subrout<strong>in</strong>e &bearbeite datei zeit<strong>in</strong>tensiv genug bekommt<br />

man folgenden Unterschied<br />

open – Wiederholung<br />

open (FILE, "PfadDerDatei") # oeffnet bestehende Datei zum Lesen<br />

open (FILE, "< PfadDerDatei") # ebenfalls<br />

open (OUT, "> Date<strong>in</strong>ame") # erzeugt neue Datei zum Schreiben<br />

open (LOG, ">> Date<strong>in</strong>ame") # ergaenzt (ggf. neu erzeugte) Datei<br />

$| = 0<br />

nach längerer Wartezeit e<strong>in</strong>malig Ausgabe e<strong>in</strong>er Punktzeile<br />

Beispiele:<br />

Fortlaufend <strong>in</strong> LOG-Datei protokollieren<br />

$| = 1<br />

sich Punkt füf Punkt aufbauende Punktzeile; Fortschritt der<br />

Bearbeitung ist ablesbar<br />

open (LOG, ">> .fehler_log")<br />

or die "Kann Logdatei nicht oeffnen: $!";<br />

pr<strong>in</strong>t LOG "...<br />

close (LOG);<br />

Systemfehlermeldungen am Ende <strong>in</strong> private Logdatei schreiben<br />

NB wenn die Pr<strong>in</strong>t-Anweisung n enthält, wird der Puffer zur<br />

Bildschirmausgabe auch bei $| = 0 unmittelbar geleert<br />

open (STDERR, ">> .fehler_log") or<br />

die "Kann Logdatei nicht oeffnen: $!";<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 5<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 6<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

In-place-Bearbeitung (1)<br />

# Programm: convert_to_latex.perl<br />

$^I=".bak";<br />

# ueberschreibe Inputdatei,<br />

# erzeuge Backupdatei ’Name.bak’<br />

# (Aufruf ohne Backup-Datei: $^I="";)<br />

while () {<br />

s/Ä/{\\\"A}/g;<br />

s/Ö/{\\\"O}/g;<br />

s/Ü/{\\\"U}/g;<br />

s/ä/{\\\"a}/g;<br />

s/ö/{\\\"o}/g;<br />

s/ü/{\\\"u}/g;<br />

s/ß/{\\ss}/g;<br />

s/&/\\&/g;<br />

pr<strong>in</strong>t;<br />

# schreibe direkt <strong>in</strong> Inputdatei<br />

}<br />

Alternativ als Switch:<br />

#! /usr/b<strong>in</strong>/perl -w -i.bak # analog <strong>in</strong> Kommandozeile<br />

In-place-Bearbeitung (2)<br />

Input<br />

Reclamheft & "Draußen nur Kännchen"<br />

Welche fünf Gegenstände müssen <strong>in</strong> e<strong>in</strong>e Ausstellung über<br />

Deutschland?<br />

Aufruf convert to latex.perl text<br />

Ausgabe: <strong>Dateien</strong> text <strong>und</strong> text.bak<br />

Reclamheft \& "Drau{\ss}en nur K{\"a}nnchen"<br />

Welche f{\"u}nf Gegenst{\"a}nde m{\"u}ssen <strong>in</strong> e<strong>in</strong>e Ausstellung<br />

{\"u}ber Deutschland?<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 7<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 8


¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¥<br />

¥<br />

¥<br />

¥<br />

¥<br />

¥<br />

¥<br />

¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¥<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

<strong>Dateien</strong> löschen (1)<br />

<strong>Dateien</strong> löschen (2)<br />

über e<strong>in</strong>en Systemaufruf<br />

Rückgabewert von unl<strong>in</strong>k = Anzahl der gelöschten <strong>Dateien</strong><br />

system "rm *~";<br />

über unl<strong>in</strong>k-Funktion<br />

ke<strong>in</strong>e direkte Kontrolle über e<strong>in</strong>zelne Datei bei Liste<br />

Ausweg<br />

unl<strong>in</strong>k "slides.tex~";<br />

unl<strong>in</strong>k "slides-1.tex~", "slides-2.tex~", "slides-3.tex~";<br />

unl<strong>in</strong>k (glob "*~");<br />

foreach $dat ( qw /slides-1 slides-2 slides-3/){<br />

unl<strong>in</strong>k $dat or warn "Konnte $dat nicht loeschen: $!\n’’; }<br />

unl<strong>in</strong>k ist schneller als rm<br />

rm hat Anfrageoption, unl<strong>in</strong>k nicht<br />

Achtung! unl<strong>in</strong>k löscht auch nicht les/-schreibbare <strong>Dateien</strong>,<br />

falls Verzeichnisrechte es zulassen<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 9<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 10<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

<strong>Dateien</strong> umbenennen<br />

<strong>Dateien</strong> umbenennen - Bsp<br />

analog zu Unix-Befehl mv<br />

system "mv slides.new slides.old";<br />

rename "slides.old", "slides.new";<br />

Umbennenungen auch verzeichnisübergreifen<br />

zum<strong>in</strong>dest, wenn beide <strong>Verzeichnisse</strong> auf demselben gemounteten<br />

Volume<br />

rename "/temp/slides.old", "slides.new";<br />

rename "/temp/slides.old", "/floppy/floopy#0/slides.new";<br />

foreach $datei (glob "*.old") {<br />

$neue_datei = $datei;<br />

$neue_datei =~ s/\.old$/.new/;<br />

if (-e $neue_datei) {<br />

warn "Kann $datei nicht <strong>in</strong> $neue_datei: $neue_datei existiert bereits\n";<br />

} elsif (rename $datei, $neue_datei ) {<br />

pr<strong>in</strong>t "$datei wurde nach $neue_datei umbenannt.\n";<br />

} else {<br />

warn "Umbennenen von $datei <strong>in</strong> $neue_datei fehlgeschlagen: $!";<br />

}<br />

}<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 11<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 12


¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¥<br />

¥<br />

¥<br />

¥<br />

¢ £ ¡<br />

¢ £ ¡<br />

¥<br />

¦<br />

¥<br />

¦<br />

¥<br />

¥<br />

¥<br />

¥<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

IMS<br />

Heike Z<strong>in</strong>smeister<br />

<strong>Verzeichnisse</strong>n manipulieren<br />

Lookaro<strong>und</strong><br />

mkdir legt neue Unterverzeichnisse an<br />

gieriges Patternmatch<strong>in</strong>g arbeitet gesamten Str<strong>in</strong>g ab<br />

rmdir löscht leere <strong>Verzeichnisse</strong>;<br />

Rückgabewert = Anzahl der gelöschten <strong>Verzeichnisse</strong><br />

Probleme können entstehen, wenn Ende des Suchmusters e<strong>in</strong><br />

Fenster auf dem Str<strong>in</strong>g abdeckt, das wiederum potentiellen<br />

Anfang des Musters enthält<br />

Lösung: nicht-matchendes Lookahead/-beh<strong>in</strong>d<br />

– positives Lookahead MUSTER(?= ...) rechts vom Muster<br />

wird etwas bestimmtes erwartet<br />

– negatives Lookahead MUSTER(?! ... ) rechts vom Muster<br />

wird etwas bestimmtes ausgeschlossen<br />

– positives Lookbeh<strong>in</strong>d (?


¥<br />

¥<br />

¥<br />

¦<br />

¥<br />

¥<br />

IMS Heike Z<strong>in</strong>smeister<br />

¢ £ ¡<br />

Referenzen (3)<br />

@array = qw (Tick Trick Track);<br />

$ref1 = \@array;<br />

$ref2 = $ref1;<br />

if ($ref1 == $ref2 ) {<br />

$numerisch = $ref1+1 ;<br />

$numerisch -= 1;<br />

pr<strong>in</strong>t "Numerisch s<strong>in</strong>d sie identisch: $numerisch\n";<br />

}<br />

if ($ref1 eq $ref2) {<br />

pr<strong>in</strong>t "\$ref1 <strong>und</strong> \$ref2 haben auch denselben Debugg<strong>in</strong>str<strong>in</strong>g:<br />

$ref1.\n";<br />

}<br />

# Ausgabe:<br />

# Numerisch s<strong>in</strong>d sie identisch: 1226524<br />

# $ref1 <strong>und</strong> $ref2 haben auch denselben Debugg<strong>in</strong>str<strong>in</strong>g: ARRAY(0x12b71c)<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 18<br />

IMS Heike Z<strong>in</strong>smeister<br />

¢ £ ¡<br />

Dereferenzieren (2)<br />

Referenzierung erlaubt z.B. e<strong>in</strong>e Referenz auf e<strong>in</strong>e Datenstruktur<br />

<strong>in</strong> e<strong>in</strong>e Subrout<strong>in</strong>e weiterzugeben anstatt die Datenstruktur<br />

selbst<br />

über Dereferenzierung kann auf die eigentliche Datenstruktur<br />

zugegriffen werden<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 20<br />

IMS Heike Z<strong>in</strong>smeister<br />

¢ £ ¡<br />

Referenzen (2)<br />

Referenzen<br />

– numerische Form<br />

e<strong>in</strong>deutige Memory Adresse der <strong>in</strong>ternen Datenstruktur<br />

– Str<strong>in</strong>gform (bei pr<strong>in</strong>t Vergleich mit eq)<br />

Debugg<strong>in</strong>gstr<strong>in</strong>g<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 17<br />

IMS Heike Z<strong>in</strong>smeister<br />

¢ £ ¡<br />

Dereferenzieren (1)<br />

Referenzierung durch vorangestellten Backslash<br />

– @array<br />

– @array<br />

Dereferenzierung durch Ersetzen des Namens (auch identifiers)<br />

mit $-Identifier <strong>in</strong> geschweiften Klammern<br />

– @array<br />

– @{$referenz auf array}<br />

– $array[1]<br />

– ${$referenz auf array}[1]<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 19


¥<br />

¥<br />

IMS Heike Z<strong>in</strong>smeister<br />

¢ £ ¡<br />

Referenzen<br />

Schwartz, Randal L. & Tom Phoenix, 2002. <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Perl</strong>.<br />

Köln, O’Reilly: Teile von Kap. 12 <strong>und</strong> Ausschnitte aus Kap. 13.<br />

Schwartz, Randal L., 2003. Learn<strong>in</strong>g <strong>Perl</strong> Objects, References<br />

& Modules. O’Reilly.<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 22<br />

IMS Heike Z<strong>in</strong>smeister<br />

¢ £ ¡<br />

Übung 10<br />

Bearbeiten Sie die Zusatzaufgabe der ersten Teilaufgabe aus<br />

Übung 9 vom 9.1.2004 erneut (Sortieren von <strong>Dateien</strong> nach<br />

Extensionen <strong>und</strong> <strong>in</strong>tern alphabetisch). Verwenden Sie zum<br />

Sortieren e<strong>in</strong>e komplexe Datenstruktur. Abgabe: 22.1.2004<br />

Nächsten Donnerstag muss die Übungsst<strong>und</strong>e leider ausfallen.<br />

Sie können aber jederzeit Fragen zur Aufgabe oder den Projekten<br />

stellen<br />

<strong>Perl</strong>, 16.01.04 <strong>Dateien</strong>, <strong>Verzeichnisse</strong>, Prozess <strong>II</strong> 21

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!