Scriptorientierte Programmiertechnik Perl



Ähnliche Dokumente
Programmierung in C. Grundlagen. Stefan Kallerhoff

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Einführung in die Programmierung

Diana Lange. Generative Gestaltung Operatoren

Einführung in die C++ Programmierung für Ingenieure

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

MASCHINELLE SPRACHVERARBEITUNG Gertrud Faaß Basierend auf Folien von Dr. H Zinsmeister. Einführung in PERL

Erwin Grüner

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Linux Prinzipien und Programmierung

Einführung in die Programmierung

Angewandte Mathematik und Programmierung

Modellierung und Programmierung 1

Modul 122 VBA Scribt.docx

Klausur in Programmieren

Computeranwendung und Programmierung (CuP)

Tutorium Rechnerorganisation

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

1. Übung zu "Numerik partieller Differentialgleichungen"

Einführung in die C-Programmierung

I.1 Die Parrot Assemblersprache

E-PRIME TUTORIUM Die Programmiersprache BASIC

Kontrollstrukturen und Funktionen in C

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Graphic Coding. Klausur. 9. Februar Kurs A

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

IT-Basics 2. DI Gerhard Fließ

Java Kurs für Anfänger Einheit 2 Datentypen und Operationen

Kontrollstrukturen, Strukturierte Programmierung

Deklarationen in C. Prof. Dr. Margarita Esponda

Informatik Grundlagen, WS04, Seminar 13

Objektorientierte Programmierung

Programmierkurs Java

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Programmieren in Haskell Einführung

Informatik Repetitorium SS Volker Jaedicke

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Klausur in Programmieren

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Hochschule München, FK 03 FA SS Ingenieurinformatik

Eine Beschreibung des Programms und der dahinter stehenden Philosophie.

IT-Zertifikat: Allgemeine Informationstechnologien II PHP

Zählen von Objekten einer bestimmten Klasse

Zusammenfassung des Handzettels für Programmieren in C

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

ESP Tutorium. Studienassistent: Ewald Moitzi. Gruppe 9

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Multimedia im Netz Wintersemester 2011/12

EiP Übung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen Definition, Eigenschaften, Entwurf Darstellung von Algorithmen Beispiele.

Die Programmiersprache C

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Einführung in die Programmierung (EPR)

Datenbanken Microsoft Access 2010

Funktionale Programmierung mit Haskell

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Kontrollstrukturen. Bedingter Ablauf: if. Bedingter Ablauf: if-else

Einführung in die Programmierung

Grundlagen der Programmiersprache C++

Übersicht Programmablaufsteuerung

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Prinzipien der Softwareentwicklung S. Strahringer

Kontrollstrukturen - Universität Köln

Projektverwaltung Problem Lösung: Modulare Programmierung

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Vorlesung Informatik II

Grundlagen von C. Ausarbeitung von Jonas Gresens

Grundlagen der Informatik I Informationsdarstellung

5.4 Klassen und Objekte

Entwurf von Algorithmen - Kontrollstrukturen

Die Programmiersprache C99: Zusammenfassung

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

CGI Programmierung mit Ha. Markus Schwarz

Fallunterscheidung: if-statement

Python Programmieren. Variablen, Ausdrücke und Anweisungen

Propädeutikum. Dipl.-Inf. Frank Güttler

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Programmieren für Ingenieure Sommer Ein Rechner. Rechner sind überall. Gerät, das mittels programmierbarer Rechenvorschriften Daten verarbeitet.

Datenbanken 1. Einführung und Zugänge für die eingesetzten Resourcen. ISWeb - Information Systems & Semantic Web University of Koblenz Landau, Germany

Sin-Funktion vgl. Cos-Funktion

Auswahlabfragen mit ACCESS

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Access Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli inkl. zusätzlichem Übungsanhang ACC2010-UA

VisualBasic - Variablen

Perl-Workshop, Teil II

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Algorithmen mit Python

Luis Kornblueh. May 22, 2014

Transkript:

Scriptorientierte Programmiertechnik Perl (Revision 47) Prof. Dr.-Ing. Torsten Finke FOM 2015-02-07 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 1 / 187

Überblick Klausur Literatur Arbeitsumgebung Perl Programmierung Mehr Scriptprogrammierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 2 / 187

Überblick Klausur Literatur Arbeitsumgebung Perl Programmierung Mehr Scriptprogrammierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 2 / 187

Überblick Klausur Literatur Arbeitsumgebung Perl Programmierung Mehr Scriptprogrammierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 2 / 187

Überblick Klausur Literatur Arbeitsumgebung Perl Programmierung Mehr Scriptprogrammierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 2 / 187

Überblick Klausur Literatur Arbeitsumgebung Perl Programmierung Mehr Scriptprogrammierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 2 / 187

Klausur Klausur Formalia Dauer 120 Minuten keine Hilfsmittel Formvorschriften verbindliche Hinweise beachten leserlich schreiben Korrekturrand beachten nur Vorderseiten beschreiben nicht mehr als eine Aufgabe pro Blatt bearbeiten Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 3 / 187

Klausur Klausur Formalia Dauer 120 Minuten keine Hilfsmittel Formvorschriften verbindliche Hinweise beachten leserlich schreiben Korrekturrand beachten nur Vorderseiten beschreiben nicht mehr als eine Aufgabe pro Blatt bearbeiten Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 3 / 187

Klausur Klausur Formalia Dauer 120 Minuten keine Hilfsmittel Formvorschriften verbindliche Hinweise beachten leserlich schreiben Korrekturrand beachten nur Vorderseiten beschreiben nicht mehr als eine Aufgabe pro Blatt bearbeiten Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 3 / 187

Klausur Klausur Inhalte Inhalt komplett relevant kein Repetitorium Auswahlklausur Schwerpunkt auf Verständnis Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 4 / 187

Klausur Klausur Inhalte Inhalt komplett relevant kein Repetitorium Auswahlklausur Schwerpunkt auf Verständnis Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 4 / 187

Klausur Klausur Inhalte Inhalt komplett relevant kein Repetitorium Auswahlklausur Schwerpunkt auf Verständnis Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 4 / 187

Klausur Klausur Inhalte Inhalt komplett relevant kein Repetitorium Auswahlklausur Schwerpunkt auf Verständnis Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 4 / 187

Literatur Literatur Schwartz, Randal L., Tom Phoenix: Learning Perl. O Reilly & Associates, 2008, ISBN: 978-0596520106. a Wall, Larry, Tom Christiansen, Jon Orwant: Programming Perl. O Reilly, 2000. Christiansen, Tom, Nathan Torkington: Perl Kochbuch. Beispiele und Lösungen für Perl-Programmierer. O Reilly & Associates, 2004, ISBN: 3897213664. Conway, Damian: Object Oriented Perl. Manning Publications. Conway, Damian: Perl Best Practices. O Reilly, 2005, ISBN: 0596001738. a diese Foliensammlung orientiert sich stark an Learning Perl Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 5 / 187

Arbeitsumgebung Editor Editoren Emacs, Vim Notepad++ Eclipse, EPIC Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 6 / 187

Arbeitsumgebung Editor Arbeitsumgebung es gibt nur einen Weg, Programmieren zu lernen: Programmieren! beschaffen und installieren Sie sich eine Arbeitsumgebung! vollziehen Sie die Programmierbeispiele nach! absolvieren Sie die Übungen regelmäßig! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 7 / 187

Arbeitsumgebung Editor Arbeitsumgebung es gibt nur einen Weg, Programmieren zu lernen: Programmieren! beschaffen und installieren Sie sich eine Arbeitsumgebung! vollziehen Sie die Programmierbeispiele nach! absolvieren Sie die Übungen regelmäßig! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 7 / 187

Arbeitsumgebung Editor Arbeitsumgebung es gibt nur einen Weg, Programmieren zu lernen: Programmieren! beschaffen und installieren Sie sich eine Arbeitsumgebung! vollziehen Sie die Programmierbeispiele nach! absolvieren Sie die Übungen regelmäßig! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 7 / 187

Arbeitsumgebung Perl Perl-Interpreter auf vielen Plattformen verfügbar unter Unix meist vorhanden Windows: http://www.activestate.com/products/activeperl/index.mhtml Distribution via http://www.cpan.org integrierte Online-Dokumentation via perldoc Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 8 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Was ist Perl? Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister #!/usr/bin/perl foreach ( perldoc -u -f atan2 ) { s/\w<([^>]+)>/\u$1/g; print; } Interpreter (Just-in-Time compiler) Schwach typisiert Prozedural/Objektorientiert Sprachmächtig, viele Zusatzmodule Online Dokumentation perldoc Autor: Larry Wall und viele weitere Contributoren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 9 / 187

Arbeitsumgebung Perl Wofür Perl? Einsatzgebiete: Arbeiten auf Textdaten (sehr stark) WWW (CGI) Systemadministration Kleine bis mittlere Softwareprojekte (Beispiel BackupPC) Command line tools GUI (mit Tk oder Qt) Wo eher nicht? Hardwarenahe Software Nichtoffener Quelltext Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 10 / 187

Arbeitsumgebung Hello World! Hello World! Datei: hello.pl Windows: Suffix.pl mit Ausführung des Interpreters perl verknüpft Aufruf in Eingabeaufforderung:.\hello.pl oder perl hello.pl Un*x: chmod +x hello.pl deklariert Datei als Programm Aufruf aus Terminal:./hello.pl #!/usr/bin/perl print "Hello World!\n"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 11 / 187

Arbeitsumgebung Hello World! Übungen Provozieren Sie Fehler: Dateisuffix verändern Ausführbarkeit der Datei unterbinden (unter Linux) erste Zeile des Programms manipulieren (was bedeuten die Teile der ersten Zeile?) Semikolon löschen Anführungszeichen löschen Verändern Sie die Wirkung des Programms \n entfernen Ausgabetext verändern Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 12 / 187

Arbeitsumgebung Hello World! Übungen Provozieren Sie Fehler: Dateisuffix verändern Ausführbarkeit der Datei unterbinden (unter Linux) erste Zeile des Programms manipulieren (was bedeuten die Teile der ersten Zeile?) Semikolon löschen Anführungszeichen löschen Verändern Sie die Wirkung des Programms \n entfernen Ausgabetext verändern Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 12 / 187

Scalare Daten und Operatoren Scalare Daten elementarer Datentyp Komponente aggregierter Datentypen schwach typisiert meist Zahlen oder Zeichenketten #!/usr/bin/perl print... Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 13 / 187

Scalare Daten und Operatoren Scalare Daten elementarer Datentyp Komponente aggregierter Datentypen schwach typisiert meist Zahlen oder Zeichenketten #!/usr/bin/perl print... Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 13 / 187

Scalare Daten und Operatoren Scalare Daten elementarer Datentyp Komponente aggregierter Datentypen schwach typisiert meist Zahlen oder Zeichenketten #!/usr/bin/perl print... Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 13 / 187

Scalare Daten und Operatoren Scalare Daten elementarer Datentyp Komponente aggregierter Datentypen schwach typisiert meist Zahlen oder Zeichenketten #!/usr/bin/perl print... Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 13 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Zahlen Zahlen intern als double gespeichert(c, meist IEEE 754) Ganzzahlarithmetik kann erzwungen werden: Pragma integer Wirkung auf arithmetische Operationen beschränkt, Bespiel 3/2 1 interne Speicherung als int wo sinnvoll, wird automatisch in Ganzzahlen gewandelt unterscheide Zahl und ihre Darstellung! Wandlung Zahl Zeichenkette bei Bedarf siehe perldoc: perldata Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 14 / 187

Scalare Daten und Operatoren Fließpunkt-Literale 1. 1.5 0.2.5 +3.14-2.718 6.023e23 = 6.023 10 23 = 602300000000000000000000 1.05457e-34 = 1.05457 10 34 1E3 = 1000 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 15 / 187

Scalare Daten und Operatoren Ganzzahl-Literale Integers dezimal 0 1 42-2001 1680801063338 1_680_801_063_338 = 1680801063338 nondezimal oktal: führende Null 0377 = 255 hexadezimal: führend 0x 0xff = 0xFF = 255 binär: führend 0b 0b11111111 = 255 0x4A_7B_D3_EC Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 16 / 187

Scalare Daten und Operatoren Ganzzahl-Literale Integers dezimal 0 1 42-2001 1680801063338 1_680_801_063_338 = 1680801063338 nondezimal oktal: führende Null 0377 = 255 hexadezimal: führend 0x 0xff = 0xFF = 255 binär: führend 0b 0b11111111 = 255 0x4A_7B_D3_EC Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 16 / 187

Scalare Daten und Operatoren Arithmetische Operatoren 2 + 3 2.3 + 1.34E1 3 * 4 15 / 3 5 / 3 1.2 / 0.3 13 % 5 (Modulo, Divisionsrest; Ganzzahlrechnung) 2 ** 3 (Potenz) siehe perldoc: perlop Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 17 / 187

Scalare Daten und Operatoren Arithmetische Operatoren 2 + 3 2.3 + 1.34E1 3 * 4 15 / 3 5 / 3 1.2 / 0.3 13 % 5 (Modulo, Divisionsrest; Ganzzahlrechnung) 2 ** 3 (Potenz) siehe perldoc: perlop Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 17 / 187

Scalare Daten und Operatoren Bit-Operatoren 13 & 11 13 11 13 ^ 11 7 << 3 0xff >> 4 ~13 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 18 / 187

Scalare Daten und Operatoren Zeichenketten Strings String: Folge von Zeichen (z.b. Bytes) Kodierung systemabhängig, z.b. ASCII kürzester String: leer längster String: entsprechend verfügbarem Speicher Zeichenfolgen beliebig interpretierbar (Bilder, Sound usw.) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 19 / 187

Scalare Daten und Operatoren Zeichenketten Strings String: Folge von Zeichen (z.b. Bytes) Kodierung systemabhängig, z.b. ASCII kürzester String: leer längster String: entsprechend verfügbarem Speicher Zeichenfolgen beliebig interpretierbar (Bilder, Sound usw.) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 19 / 187

Scalare Daten und Operatoren Zeichenketten Strings String: Folge von Zeichen (z.b. Bytes) Kodierung systemabhängig, z.b. ASCII kürzester String: leer längster String: entsprechend verfügbarem Speicher Zeichenfolgen beliebig interpretierbar (Bilder, Sound usw.) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 19 / 187

Scalare Daten und Operatoren Zeichenketten Strings String: Folge von Zeichen (z.b. Bytes) Kodierung systemabhängig, z.b. ASCII kürzester String: leer längster String: entsprechend verfügbarem Speicher Zeichenfolgen beliebig interpretierbar (Bilder, Sound usw.) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 19 / 187

Scalare Daten und Operatoren Zeichenketten-Literale Single Quoting hello Apostroph \ im Text hello world gute\n Tag \ \\ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 20 / 187

Scalare Daten und Operatoren Zeichenketten-Literale Double Quoting "hello" "hello world\n" "Zitat: \"Hello World\"" "Kurzzitat: hello " "hello\tworld" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 21 / 187

Scalare Daten und Operatoren Zeichenketten Sonderzeichen \n, \r line feed, carriage return \t, \f tab, form feed \a, \e beep, escape \007, \x7f octal, hexadecimal codes \l, \u next letter lower (upper) case \L, \U, \E following characters lower (upper) case until \E Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 22 / 187

Scalare Daten und Operatoren Zeichenketten-Operatoren "hello". "world" Verkettung "hello".. "world" "hello" x 3 Repetition "hello" x (3 + 2) "hello" x (3 / 2) 3 x hello 3 x 4 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 23 / 187

Scalare Daten und Operatoren Zeichenketten-Operatoren "hello". "world" Verkettung "hello".. "world" "hello" x 3 Repetition "hello" x (3 + 2) "hello" x (3 / 2) 3 x hello 3 x 4 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 23 / 187

Scalare Daten und Operatoren Konversion: Strings Zahlen Kontext: Operatoren definieren den Kontext der Operanden Operanden werden bei Bedarf gewandelt Semantik der Operatoren bleibt erhalten 3 + 4 3. 4 3 + hello 3 + 4hello 3 + 4.3hello 3 + 042hello dezimal #!/usr/bin/perl -w # Warnung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 24 / 187

Scalare Daten und Operatoren Konversion: Strings Zahlen Kontext: Operatoren definieren den Kontext der Operanden Operanden werden bei Bedarf gewandelt Semantik der Operatoren bleibt erhalten 3 + 4 3. 4 3 + hello 3 + 4hello 3 + 4.3hello 3 + 042hello dezimal #!/usr/bin/perl -w # Warnung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 24 / 187

Scalare Daten und Operatoren Konversion: Strings Zahlen Kontext: Operatoren definieren den Kontext der Operanden Operanden werden bei Bedarf gewandelt Semantik der Operatoren bleibt erhalten 3 + 4 3. 4 3 + hello 3 + 4hello 3 + 4.3hello 3 + 042hello dezimal #!/usr/bin/perl -w # Warnung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 24 / 187

Scalare Daten und Operatoren Vergleichsoperatoren 03 == 3 42.0 < 7 x 7 "123" eq 123 gt "abc" cmp ABC Vergleich arithmetisch textlich gleich == eq ungleich!= ne kleiner < lt kleiner oder gleich <= le größer > gt größer oder gleich >= ge Reihenfolge <=> cmp Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 25 / 187

Scalare Daten und Operatoren Vergleichsoperatoren 03 == 3 42.0 < 7 x 7 "123" eq 123 gt "abc" cmp ABC Vergleich arithmetisch textlich gleich == eq ungleich!= ne kleiner < lt kleiner oder gleich <= le größer > gt größer oder gleich >= ge Reihenfolge <=> cmp Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 25 / 187

Scalare Daten und Operatoren Weitere Scalare Daten undef Referenzen File-Handles Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 26 / 187

Scalare Daten und Operatoren Scalare Variable $variable_mit_langem_namen $a $_auch_einevariable $ABC keine Großbuchstaben am Namensanfang! sprechende Namen Autovivifikation siehe perldoc: perlvar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 27 / 187

Scalare Daten und Operatoren Scalare Variable $variable_mit_langem_namen $a $_auch_einevariable $ABC keine Großbuchstaben am Namensanfang! sprechende Namen Autovivifikation siehe perldoc: perlvar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 27 / 187

Scalare Daten und Operatoren Scalare Variable $variable_mit_langem_namen $a $_auch_einevariable $ABC keine Großbuchstaben am Namensanfang! sprechende Namen Autovivifikation siehe perldoc: perlvar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 27 / 187

Scalare Daten und Operatoren Scalare Variable $variable_mit_langem_namen $a $_auch_einevariable $ABC keine Großbuchstaben am Namensanfang! sprechende Namen Autovivifikation siehe perldoc: perlvar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 27 / 187

Scalare Daten und Operatoren Scalare Variable $variable_mit_langem_namen $a $_auch_einevariable $ABC keine Großbuchstaben am Namensanfang! sprechende Namen Autovivifikation siehe perldoc: perlvar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 27 / 187

Scalare Daten und Operatoren Scalare Zuweisung $x = 42 $name = "Alfred" $sum = 3 + $name $lied = tra. la x 3 $x = $x + 4 $x += 4 $a.= "hello" $x **= 3 $z = $y = $x += 3 $x = (2,3 + 5) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 28 / 187

Scalare Daten und Operatoren Scalare Zuweisung $x = 42 $name = "Alfred" $sum = 3 + $name $lied = tra. la x 3 $x = $x + 4 $x += 4 $a.= "hello" $x **= 3 $z = $y = $x += 3 $x = (2,3 + 5) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 28 / 187

Scalare Daten und Operatoren Scalare Zuweisung $x = 42 $name = "Alfred" $sum = 3 + $name $lied = tra. la x 3 $x = $x + 4 $x += 4 $a.= "hello" $x **= 3 $z = $y = $x += 3 $x = (2,3 + 5) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 28 / 187

Scalare Daten und Operatoren Scalare Zuweisung $x = 42 $name = "Alfred" $sum = 3 + $name $lied = tra. la x 3 $x = $x + 4 $x += 4 $a.= "hello" $x **= 3 $z = $y = $x += 3 $x = (2,3 + 5) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 28 / 187

Scalare Daten und Operatoren Interpolation $name = "Alfred" print "Hallo $name" print Hallo $name print "x = $x\n" print x =. $x, "\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 29 / 187

Scalare Daten und Operatoren Operatoren Arithmetik Zeichenketten Zuweisung Vergleich Kardinalität (unär, binär, ternär) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 30 / 187

Scalare Daten und Operatoren Operatoren Arithmetik Zeichenketten Zuweisung Vergleich Kardinalität (unär, binär, ternär) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 30 / 187

Scalare Daten und Operatoren Operatoren Assoziativität und Präzedenz links -> nichtassoziativ ++ -- rechts ** rechts! ~ \ unär: + - links =~!~ links * / % x links + -. links << >> nichtassoziativ < > <= >= lt gt le ge nichtassoziativ ==!= <=> eq ne cmp ~~ links & links ^ links && links // nichtassoziativ..... rechts?: rechts = += -= *= etc. links, => rechts not links and links or xor Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 31 / 187

Scalare Daten und Operatoren Übungen Was ergeben die folgenden Statements? $x = 039 2 + 3 * 4 9-4 - 2 2 ** 3 ** 4 5.7 % 2.1 ~0 hello x world 3 * 4 x 5 3 x 4 * 5 3 + 4. 5 $y = 2; $x = $y += 3 $x = (3,4) $y = 4; $x = ( $y < 5 ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 32 / 187

Einfache Programmierung Fallunterscheidung Selektion $x = 3; if ( $x % 2 == 1 ) { print "$x ist ungerade\n"; } $x = 3; if ( $x % 2 == 0 ) { print "$x ist gerade\n"; } else { print "$x ist ungerade\n"; print "$x ist eventuell prim"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 33 / 187

Einfache Programmierung Was ist wahr? $x = 42; if ( $x ) { print "$x ist wahr\n" } falsch: 0 0 undef wahr: alles andere 1 "abc" " " 00 false Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 34 / 187

Einfache Programmierung Was ist wahr? $x = 42; if ( $x ) { print "$x ist wahr\n" } falsch: 0 0 undef wahr: alles andere 1 "abc" " " 00 false Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 34 / 187

Einfache Programmierung Was ist wahr? $x = 42; if ( $x ) { print "$x ist wahr\n" } falsch: 0 0 undef wahr: alles andere 1 "abc" " " 00 false Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 34 / 187

Einfache Programmierung Eingabe $x = <STDIN>; chomp $x; # remove linebreak if ( $x eq $x + 0 ) { print "Eingabe $x numerisch interpretierbar\n" } Achtung: was bewirkt $y = chomp($x) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 35 / 187

Einfache Programmierung Eingabe $x = <STDIN>; chomp $x; # remove linebreak if ( $x eq $x + 0 ) { print "Eingabe $x numerisch interpretierbar\n" } Achtung: was bewirkt $y = chomp($x) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 35 / 187

Einfache Programmierung Schleife Iteration $n = 5; while ( $n ) { "n = $n\n"; $n -= 1; } $x = undef; # clear $x while ( $x ) { print "hello\n" } $x = <STDIN>; if ( defined $x ) {print "Eingabe war $x"} while ( $x = <STDIN> ) { print $x } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 36 / 187

Einfache Programmierung Schleife Iteration $n = 5; while ( $n ) { "n = $n\n"; $n -= 1; } $x = undef; # clear $x while ( $x ) { print "hello\n" } $x = <STDIN>; if ( defined $x ) {print "Eingabe war $x"} while ( $x = <STDIN> ) { print $x } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 36 / 187

Einfache Programmierung Schleife Iteration $n = 5; while ( $n ) { "n = $n\n"; $n -= 1; } $x = undef; # clear $x while ( $x ) { print "hello\n" } $x = <STDIN>; if ( defined $x ) {print "Eingabe war $x"} while ( $x = <STDIN> ) { print $x } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 36 / 187

Einfache Programmierung Schleife Iteration $n = 5; while ( $n ) { "n = $n\n"; $n -= 1; } $x = undef; # clear $x while ( $x ) { print "hello\n" } $x = <STDIN>; if ( defined $x ) {print "Eingabe war $x"} while ( $x = <STDIN> ) { print $x } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 36 / 187

Einfache Programmierung Kommentare # bis Zeilenende Autor Datum Zweck unsinnige Kommentare $x += 1; # x inkrementieren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 37 / 187

Einfache Programmierung Kommentare # bis Zeilenende Autor Datum Zweck unsinnige Kommentare $x += 1; # x inkrementieren Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 37 / 187

Listen und Felder Liste Feld aggregierter Datentyp numerischer Index (ab Null) Feld, Array: benannte Liste, Listenvariable Liste: unbenannte Liste Aufbau aus Scalaren. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 38 / 187

Listen und Felder Liste Feld aggregierter Datentyp numerischer Index (ab Null) Feld, Array: benannte Liste, Listenvariable Liste: unbenannte Liste Aufbau aus Scalaren. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 38 / 187

Listen und Felder Liste Feld aggregierter Datentyp numerischer Index (ab Null) Feld, Array: benannte Liste, Listenvariable Liste: unbenannte Liste Aufbau aus Scalaren. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 38 / 187

Listen und Felder Feldelemente Zugriff: $a[0] = "hello"; $a[1] = "world"; $a[2] = 42; $a[5] = "hop"; Nutzung: $a[2] / 7; $a[1] x 2; Was ist $a? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 39 / 187

Listen und Felder Feldelemente Zugriff: $a[0] = "hello"; $a[1] = "world"; $a[2] = 42; $a[5] = "hop"; Nutzung: $a[2] / 7; $a[1] x 2; Was ist $a? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 39 / 187

Listen und Felder Feldelemente Zugriff: $a[0] = "hello"; $a[1] = "world"; $a[2] = 42; $a[5] = "hop"; Nutzung: $a[2] / 7; $a[1] x 2; Was ist $a? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 39 / 187

Listen und Felder Spezielle Feldindizes Ende: $n = $#a $a[$#a] $a[-1] $a[-100] $a[100] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 40 / 187

Listen und Felder Listen-Literale (1, 2, 3) (1, 2, 3,) ("hello", "world", 42) (1.. 13) (7.3.. 12.5) (9.. 0) (0.. $#a) ($x + $y, $a. $b) qw/ hello world / qw( hello world ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 41 / 187

Listen und Felder Listen-Literale (1, 2, 3) (1, 2, 3,) ("hello", "world", 42) (1.. 13) (7.3.. 12.5) (9.. 0) (0.. $#a) ($x + $y, $a. $b) qw/ hello world / qw( hello world ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 41 / 187

Listen und Felder Listen-Literale (1, 2, 3) (1, 2, 3,) ("hello", "world", 42) (1.. 13) (7.3.. 12.5) (9.. 0) (0.. $#a) ($x + $y, $a. $b) qw/ hello world / qw( hello world ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 41 / 187

Listen und Felder Listen-Literale (1, 2, 3) (1, 2, 3,) ("hello", "world", 42) (1.. 13) (7.3.. 12.5) (9.. 0) (0.. $#a) ($x + $y, $a. $b) qw/ hello world / qw( hello world ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 41 / 187

Listen und Felder Listenzuweisung ($a, $b, $c) = ("hello", "world", 42) ($a[0], $a[1], $a[2]) = ("hello", "world", 42) @a = ("hello", "world", 42) @gruss = qw ( hello world ) @intervall = (0.. 1e3) $a = 13; @z = (@a, undef, @a, $a) @a = $a @b = @a @a = () $#a = -1 @a = undef # Oops! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 42 / 187

Listen und Felder Listenzuweisung ($a, $b, $c) = ("hello", "world", 42) ($a[0], $a[1], $a[2]) = ("hello", "world", 42) @a = ("hello", "world", 42) @gruss = qw ( hello world ) @intervall = (0.. 1e3) $a = 13; @z = (@a, undef, @a, $a) @a = $a @b = @a @a = () $#a = -1 @a = undef # Oops! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 42 / 187

Listen und Felder Listenzuweisung ($a, $b, $c) = ("hello", "world", 42) ($a[0], $a[1], $a[2]) = ("hello", "world", 42) @a = ("hello", "world", 42) @gruss = qw ( hello world ) @intervall = (0.. 1e3) $a = 13; @z = (@a, undef, @a, $a) @a = $a @b = @a @a = () $#a = -1 @a = undef # Oops! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 42 / 187

Listen und Felder Listenzuweisung ($a, $b, $c) = ("hello", "world", 42) ($a[0], $a[1], $a[2]) = ("hello", "world", 42) @a = ("hello", "world", 42) @gruss = qw ( hello world ) @intervall = (0.. 1e3) $a = 13; @z = (@a, undef, @a, $a) @a = $a @b = @a @a = () $#a = -1 @a = undef # Oops! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 42 / 187

Listen und Felder Listenzuweisung ($a, $b, $c) = ("hello", "world", 42) ($a[0], $a[1], $a[2]) = ("hello", "world", 42) @a = ("hello", "world", 42) @gruss = qw ( hello world ) @intervall = (0.. 1e3) $a = 13; @z = (@a, undef, @a, $a) @a = $a @b = @a @a = () $#a = -1 @a = undef # Oops! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 42 / 187

Listen und Felder Feldoperatoren @a = ("hello", "world", 42) $last = pop @a pop @a push @a, "13" push @a, (1.. 9) $first = shift @a unshift @a, "123" push @a, shift @a pop, shift auf leerem Array: undef Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 43 / 187

Listen und Felder Feldoperatoren @a = ("hello", "world", 42) $last = pop @a pop @a push @a, "13" push @a, (1.. 9) $first = shift @a unshift @a, "123" push @a, shift @a pop, shift auf leerem Array: undef Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 43 / 187

Listen und Felder Feldoperatoren @a = ("hello", "world", 42) $last = pop @a pop @a push @a, "13" push @a, (1.. 9) $first = shift @a unshift @a, "123" push @a, shift @a pop, shift auf leerem Array: undef Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 43 / 187

Listen und Felder Feldoperatoren @a = ("hello", "world", 42) $last = pop @a pop @a push @a, "13" push @a, (1.. 9) $first = shift @a unshift @a, "123" push @a, shift @a pop, shift auf leerem Array: undef Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 43 / 187

Listen und Felder Feldoperatoren @a = ("hello", "world", 42) $last = pop @a pop @a push @a, "13" push @a, (1.. 9) $first = shift @a unshift @a, "123" push @a, shift @a pop, shift auf leerem Array: undef Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 43 / 187

Listen und Felder Listeninterpolation @text = qw( Perl Prgramm ) print "Dies ist ein @text\n" print "Dies ist ein @{text}lein\n" print "Dies ist ein $text[-1]lein\n" $n = "3-2" print "Dies ist ein $text[$n]lein\n" print @text Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 44 / 187

Listen und Felder Listeninterpolation @text = qw( Perl Prgramm ) print "Dies ist ein @text\n" print "Dies ist ein @{text}lein\n" print "Dies ist ein $text[-1]lein\n" $n = "3-2" print "Dies ist ein $text[$n]lein\n" print @text Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 44 / 187

Listen und Felder Listeninterpolation @text = qw( Perl Prgramm ) print "Dies ist ein @text\n" print "Dies ist ein @{text}lein\n" print "Dies ist ein $text[-1]lein\n" $n = "3-2" print "Dies ist ein $text[$n]lein\n" print @text Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 44 / 187

Listen und Felder Listeniteration @languages = qw(c Java Perl Fortran Assembler) foreach $lang ( @languages ) { print "$lang\n" } foreach ( @languages ) { print } foreach ( @languages ) { print "$_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 45 / 187

Listen und Felder Listeniteration @languages = qw(c Java Perl Fortran Assembler) foreach $lang ( @languages ) { print "$lang\n" } foreach ( @languages ) { print } foreach ( @languages ) { print "$_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 45 / 187

Listen und Felder Listeniteration @languages = qw(c Java Perl Fortran Assembler) foreach $lang ( @languages ) { print "$lang\n" } foreach ( @languages ) { print } foreach ( @languages ) { print "$_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 45 / 187

Listen und Felder Operationen auf Listen @a = (1.. 12) @r = reverse @a @a = reverse @a @s = sort @a @s = reverse sort @a @s = sort reverse @a @s = sort { $a <=> $b } @a @m = map { 3 * $_ } @a map { $_ *= 3 } @a @g = grep { $_ % 2 == 0 } @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 46 / 187

Listen und Felder Operationen auf Listen @a = (1.. 12) @r = reverse @a @a = reverse @a @s = sort @a @s = reverse sort @a @s = sort reverse @a @s = sort { $a <=> $b } @a @m = map { 3 * $_ } @a map { $_ *= 3 } @a @g = grep { $_ % 2 == 0 } @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 46 / 187

Listen und Felder Operationen auf Listen @a = (1.. 12) @r = reverse @a @a = reverse @a @s = sort @a @s = reverse sort @a @s = sort reverse @a @s = sort { $a <=> $b } @a @m = map { 3 * $_ } @a map { $_ *= 3 } @a @g = grep { $_ % 2 == 0 } @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 46 / 187

Listen und Felder Operationen auf Listen @a = (1.. 12) @r = reverse @a @a = reverse @a @s = sort @a @s = reverse sort @a @s = sort reverse @a @s = sort { $a <=> $b } @a @m = map { 3 * $_ } @a map { $_ *= 3 } @a @g = grep { $_ % 2 == 0 } @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 46 / 187

Listen und Felder Listenkontext @a = (1.. 12); @b = qw( hello world ) @a = (2, 3, 5), aber $a = (2, 3, 5) 3 + @a $n = @a ($n) = @a @z = reverse @a $z = reverse @a $z = reverse "foobar" @t = 3 + 4 print "Intervall hat ", scalar @a, " Werte\n" print "Intervall hat ", @a + 0, " Werte\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 47 / 187

Listen und Felder Listenkontext @a = (1.. 12); @b = qw( hello world ) @a = (2, 3, 5), aber $a = (2, 3, 5) 3 + @a $n = @a ($n) = @a @z = reverse @a $z = reverse @a $z = reverse "foobar" @t = 3 + 4 print "Intervall hat ", scalar @a, " Werte\n" print "Intervall hat ", @a + 0, " Werte\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 47 / 187

Listen und Felder Listenkontext @a = (1.. 12); @b = qw( hello world ) @a = (2, 3, 5), aber $a = (2, 3, 5) 3 + @a $n = @a ($n) = @a @z = reverse @a $z = reverse @a $z = reverse "foobar" @t = 3 + 4 print "Intervall hat ", scalar @a, " Werte\n" print "Intervall hat ", @a + 0, " Werte\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 47 / 187

Listen und Felder Listenkontext @a = (1.. 12); @b = qw( hello world ) @a = (2, 3, 5), aber $a = (2, 3, 5) 3 + @a $n = @a ($n) = @a @z = reverse @a $z = reverse @a $z = reverse "foobar" @t = 3 + 4 print "Intervall hat ", scalar @a, " Werte\n" print "Intervall hat ", @a + 0, " Werte\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 47 / 187

Listen und Felder Listenkontext @a = (1.. 12); @b = qw( hello world ) @a = (2, 3, 5), aber $a = (2, 3, 5) 3 + @a $n = @a ($n) = @a @z = reverse @a $z = reverse @a $z = reverse "foobar" @t = 3 + 4 print "Intervall hat ", scalar @a, " Werte\n" print "Intervall hat ", @a + 0, " Werte\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 47 / 187

Listen und Felder Listenkontext @a = (1.. 12); @b = qw( hello world ) @a = (2, 3, 5), aber $a = (2, 3, 5) 3 + @a $n = @a ($n) = @a @z = reverse @a $z = reverse @a $z = reverse "foobar" @t = 3 + 4 print "Intervall hat ", scalar @a, " Werte\n" print "Intervall hat ", @a + 0, " Werte\n" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 47 / 187

Listen und Felder Feldbereiche @a = (1.. 9) $x = $a[3] @m = @a[2..7] @n = ( 2.. 7 ); @m = @a[@n] splice @a, 2, 3, qw/foo bar/ @rem = splice @a, 2, 3 $rem = splice @a, 2, 3 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 48 / 187

Listen und Felder Feldbereiche @a = (1.. 9) $x = $a[3] @m = @a[2..7] @n = ( 2.. 7 ); @m = @a[@n] splice @a, 2, 3, qw/foo bar/ @rem = splice @a, 2, 3 $rem = splice @a, 2, 3 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 48 / 187

Listen und Felder Feldbereiche @a = (1.. 9) $x = $a[3] @m = @a[2..7] @n = ( 2.. 7 ); @m = @a[@n] splice @a, 2, 3, qw/foo bar/ @rem = splice @a, 2, 3 $rem = splice @a, 2, 3 Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 48 / 187

Listen und Felder Listeneingabe @text = <STDIN> chomp @text chomp(@text = <STDIN>) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 49 / 187

Listen und Felder Listeneingabe @text = <STDIN> chomp @text chomp(@text = <STDIN>) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 49 / 187

Listen und Felder Übungen Was bewirkt die folgende Anweisung? ($x, $y) = ($y, $x) Auf welche Weise kann ein Array gelöscht werden? Schreiben Sie ein Programm, das die Anzahl der eingelesenen Zeilen ausgibt! Schreiben Sie ein Programm, das die eingelesenen Zeilen in umgekehrter Reihenfolge wieder ausgibt! Wie können die Funktionen pop, push, shift und unshift durch splice nachgebildet werden? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 50 / 187

Funktionen Funktionen Listenoperatoren oder unäre Operatoren Listenkontext der Argumente Klammern: was aussieht wie eine Funktion, ist eine Funktion Klammern dürfen fehlen ohne Klammern gilt Operatorpräzedenz siehe perldoc: perlfunc Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 51 / 187

Funktionen Funktionen Listenoperatoren oder unäre Operatoren Listenkontext der Argumente Klammern: was aussieht wie eine Funktion, ist eine Funktion Klammern dürfen fehlen ohne Klammern gilt Operatorpräzedenz siehe perldoc: perlfunc Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 51 / 187

Funktionen Funktionen Listenoperatoren oder unäre Operatoren Listenkontext der Argumente Klammern: was aussieht wie eine Funktion, ist eine Funktion Klammern dürfen fehlen ohne Klammern gilt Operatorpräzedenz siehe perldoc: perlfunc Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 51 / 187

Funktionen Numerische Funktionen sqrt $x # Wurzel abs $x # Betrag exp $x # e^x log $x # Logarithmus naturalis sin $x, cos $x # Trigonometrie atan2 $y, $x # Arcus-Tangens [-Pi:Pi] $pi = 4 * atan2 1,1 rand $n # Zufallszahl < n Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 52 / 187

Funktionen Numerische Funktionen sqrt $x # Wurzel abs $x # Betrag exp $x # e^x log $x # Logarithmus naturalis sin $x, cos $x # Trigonometrie atan2 $y, $x # Arcus-Tangens [-Pi:Pi] $pi = 4 * atan2 1,1 rand $n # Zufallszahl < n Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 52 / 187

Funktionen Numerische Funktionen sqrt $x # Wurzel abs $x # Betrag exp $x # e^x log $x # Logarithmus naturalis sin $x, cos $x # Trigonometrie atan2 $y, $x # Arcus-Tangens [-Pi:Pi] $pi = 4 * atan2 1,1 rand $n # Zufallszahl < n Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 52 / 187

Funktionen Numerische Funktionen sqrt $x # Wurzel abs $x # Betrag exp $x # e^x log $x # Logarithmus naturalis sin $x, cos $x # Trigonometrie atan2 $y, $x # Arcus-Tangens [-Pi:Pi] $pi = 4 * atan2 1,1 rand $n # Zufallszahl < n Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 52 / 187

Funktionen Zeichenkettenfunktionen length $line reverse $line index $line, $word, $startpos $p = 0; while ( ( $p = index $line, $word, $p ) >= 0 ) { print "found $word at position $p\n"; $p += 1; } rindex $line, $word, $startpos # last $ex = substr $line, $offset, $length substr $line, $offset, $length, $repl Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 53 / 187

Funktionen Zeichenkettenfunktionen length $line reverse $line index $line, $word, $startpos $p = 0; while ( ( $p = index $line, $word, $p ) >= 0 ) { print "found $word at position $p\n"; $p += 1; } rindex $line, $word, $startpos # last $ex = substr $line, $offset, $length substr $line, $offset, $length, $repl Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 53 / 187

Funktionen Zeichenkettenfunktionen length $line reverse $line index $line, $word, $startpos $p = 0; while ( ( $p = index $line, $word, $p ) >= 0 ) { print "found $word at position $p\n"; $p += 1; } rindex $line, $word, $startpos # last $ex = substr $line, $offset, $length substr $line, $offset, $length, $repl Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 53 / 187

Funktionen Zeichenkettenfunktionen length $line reverse $line index $line, $word, $startpos $p = 0; while ( ( $p = index $line, $word, $p ) >= 0 ) { print "found $word at position $p\n"; $p += 1; } rindex $line, $word, $startpos # last $ex = substr $line, $offset, $length substr $line, $offset, $length, $repl Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 53 / 187

Funktionen Zeichenkettenfunktionen length $line reverse $line index $line, $word, $startpos $p = 0; while ( ( $p = index $line, $word, $p ) >= 0 ) { print "found $word at position $p\n"; $p += 1; } rindex $line, $word, $startpos # last $ex = substr $line, $offset, $length substr $line, $offset, $length, $repl Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 53 / 187

Funktionen Umwandlungsfunktionen hex $string; oct $string # String als hex./oct. Zahl chr $num # Zeichen der Codetabelle ord $char # Nummer des Zeichens uc $a; lc $a; ucfirst $a # gro ß /klein Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 54 / 187

Funktionen Umwandlungsfunktionen hex $string; oct $string # String als hex./oct. Zahl chr $num # Zeichen der Codetabelle ord $char # Nummer des Zeichens uc $a; lc $a; ucfirst $a # gro ß /klein Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 54 / 187

Funktionen Umwandlungsfunktionen hex $string; oct $string # String als hex./oct. Zahl chr $num # Zeichen der Codetabelle ord $char # Nummer des Zeichens uc $a; lc $a; ucfirst $a # gro ß /klein Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 54 / 187

Unterprogramme Benutzerdefinierte Funktionen Erweiterung Funktionsumfang Wiederverwendung von Code Unterschied Funktion/Subroutine Qualifizierer & (optional) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 55 / 187

Unterprogramme Benutzerdefinierte Funktionen Erweiterung Funktionsumfang Wiederverwendung von Code Unterschied Funktion/Subroutine Qualifizierer & (optional) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 55 / 187

Unterprogramme Benutzerdefinierte Funktionen Erweiterung Funktionsumfang Wiederverwendung von Code Unterschied Funktion/Subroutine Qualifizierer & (optional) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 55 / 187

Unterprogramme Unterprogramm Definition sub mehr { $n += 2; print "n = $n\n"; } Definition an beliebiger Stelle im Quelltext Definition global Mehrfachdefinition möglich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 56 / 187

Unterprogramme Unterprogramm Definition sub mehr { $n += 2; print "n = $n\n"; } Definition an beliebiger Stelle im Quelltext Definition global Mehrfachdefinition möglich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 56 / 187

Unterprogramme Unterprogramm Definition sub mehr { $n += 2; print "n = $n\n"; } Definition an beliebiger Stelle im Quelltext Definition global Mehrfachdefinition möglich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 56 / 187

Unterprogramme Unterprogramm Aufruf $n = 13; &mehr &mehr Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 57 / 187

Unterprogramme Unterprogramm Rückgabewerte Rückgabe: letzter evaluierter Wert sub sum { $c = $a + $b; } sub sum { $c = $a + $b; print "c = $c\n"; } sub fun { if ( $a > 3 ) { $x; } else { ( 1.. 5 ); } } Expliziter Rücksprung sub fun { if ( $a < 0 ) { return -1; } else { $x = 42; } $x * $a; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 58 / 187

Unterprogramme Unterprogramm Rückgabewerte Rückgabe: letzter evaluierter Wert sub sum { $c = $a + $b; } sub sum { $c = $a + $b; print "c = $c\n"; } sub fun { if ( $a > 3 ) { $x; } else { ( 1.. 5 ); } } Expliziter Rücksprung sub fun { if ( $a < 0 ) { return -1; } else { $x = 42; } $x * $a; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 58 / 187

Unterprogramme Unterprogramm Rückgabewerte Rückgabe: letzter evaluierter Wert sub sum { $c = $a + $b; } sub sum { $c = $a + $b; print "c = $c\n"; } sub fun { if ( $a > 3 ) { $x; } else { ( 1.. 5 ); } } Expliziter Rücksprung sub fun { if ( $a < 0 ) { return -1; } else { $x = 42; } $x * $a; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 58 / 187

Unterprogramme Unterprogramm Rückgabewerte Rückgabe: letzter evaluierter Wert sub sum { $c = $a + $b; } sub sum { $c = $a + $b; print "c = $c\n"; } sub fun { if ( $a > 3 ) { $x; } else { ( 1.. 5 ); } } Expliziter Rücksprung sub fun { if ( $a < 0 ) { return -1; } else { $x = 42; } $x * $a; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 58 / 187

Unterprogramme Unterprogramm Argumente sub max { if ( $_[0] > $_[1] ) { $_[0]; } else { $_[1]; } } $m = &max(7, 5, 11); # oops Übergabe per @_ Übung: call by reference oder call by value? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 59 / 187

Unterprogramme Unterprogramm Argumente sub max { if ( $_[0] > $_[1] ) { $_[0]; } else { $_[1]; } } $m = &max(7, 5, 11); # oops Übergabe per @_ Übung: call by reference oder call by value? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 59 / 187

Unterprogramme Private Variable sub max { my ($a, $b) = @_; if ( $a > $b ) { $a; } else { $b; } } $a = 5; $b = 7; print &max($a, $b); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 60 / 187

Unterprogramme Diskurs local älteres Perl-Idiom: local Variable bleibt global, erhält lokale Überblendung $g = "foo"; sub show { print $g; } sub local_show { local($g) = "bar"; &show(); } sub my_show { my($g) = "bar"; &show(); } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 61 / 187

Unterprogramme Diskurs local älteres Perl-Idiom: local Variable bleibt global, erhält lokale Überblendung $g = "foo"; sub show { print $g; } sub local_show { local($g) = "bar"; &show(); } sub my_show { my($g) = "bar"; &show(); } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 61 / 187

Unterprogramme Parameter-Listen sub max { if ( @_ < 2 ) { print "minimum 2 args!"; } my ($s) = shift(@_); # why? foreach ( @_ ) { if ( $_ > $s ) { $s = $_; } } $s; } $x = &max(7, 5, 13); $x = &max(); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 62 / 187

Unterprogramme Lokale Variable nutzen geschachtelte Sichtbarkeit Tip: grundsätzlich alle Variablen mit my lokalisieren überall verwendbar Kontext: my($s) = 0; foreach ( 0.. 7 ) { my ($d) = 2 * $_; $s += $d; } print $s; my ($a) = @_; # list my $a = @_; # scalar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 63 / 187

Unterprogramme Lokale Variable nutzen geschachtelte Sichtbarkeit Tip: grundsätzlich alle Variablen mit my lokalisieren überall verwendbar Kontext: my($s) = 0; foreach ( 0.. 7 ) { my ($d) = 2 * $_; $s += $d; } print $s; my ($a) = @_; # list my $a = @_; # scalar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 63 / 187

Unterprogramme Lokale Variable nutzen geschachtelte Sichtbarkeit Tip: grundsätzlich alle Variablen mit my lokalisieren überall verwendbar Kontext: my($s) = 0; foreach ( 0.. 7 ) { my ($d) = 2 * $_; $s += $d; } print $s; my ($a) = @_; # list my $a = @_; # scalar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 63 / 187

Unterprogramme Lokale Variable nutzen geschachtelte Sichtbarkeit Tip: grundsätzlich alle Variablen mit my lokalisieren überall verwendbar Kontext: my($s) = 0; foreach ( 0.. 7 ) { my ($d) = 2 * $_; $s += $d; } print $s; my ($a) = @_; # list my $a = @_; # scalar Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 63 / 187

Unterprogramme Pragma strict $dideldum = 42; print $dideldumm; # oops! Pragma use strict reduziert Namensfehler erzwingt Deklaration (per my) verbessert Wartbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 64 / 187

Unterprogramme Pragma strict $dideldum = 42; print $dideldumm; # oops! Pragma use strict reduziert Namensfehler erzwingt Deklaration (per my) verbessert Wartbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 64 / 187

Unterprogramme Übergabe getrennter Arrays Beipiel: komponentenweise Addition zweier Arrays Problem: Arrays werden in @_ verschmolzen sub add { my ( @a, @b ) = @_; # @b empty!... }... add(@x, @y); Lösung: Referenzen siehe perldoc: perlref, perlreftut Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 65 / 187

Unterprogramme Übergabe getrennter Arrays Beipiel: komponentenweise Addition zweier Arrays Problem: Arrays werden in @_ verschmolzen sub add { my ( @a, @b ) = @_; # @b empty!... }... add(@x, @y); Lösung: Referenzen siehe perldoc: perlref, perlreftut Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 65 / 187

Unterprogramme Übergabe getrennter Arrays Beipiel: komponentenweise Addition zweier Arrays Problem: Arrays werden in @_ verschmolzen sub add { my ( @a, @b ) = @_; # @b empty!... }... add(@x, @y); Lösung: Referenzen siehe perldoc: perlref, perlreftut Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 65 / 187

Unterprogramme Referenzieren Referenz enthält Verweis auf Variable (oder Funktion) Analogie zu Pointern in C Referenz entspricht Adresse (im Speicher) Referenzoperator \: $scalarref = \$foo; $arrayref = \@array; $subref = \&tool; Referenzen sind immer Skalare Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 66 / 187

Unterprogramme Referenzieren Referenz enthält Verweis auf Variable (oder Funktion) Analogie zu Pointern in C Referenz entspricht Adresse (im Speicher) Referenzoperator \: $scalarref = \$foo; $arrayref = \@array; $subref = \&tool; Referenzen sind immer Skalare Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 66 / 187

Unterprogramme Referenzieren Referenz enthält Verweis auf Variable (oder Funktion) Analogie zu Pointern in C Referenz entspricht Adresse (im Speicher) Referenzoperator \: $scalarref = \$foo; $arrayref = \@array; $subref = \&tool; Referenzen sind immer Skalare Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 66 / 187

Unterprogramme Anonyme Referenzen unbenannte Liste: $aref = [ 42, "foo", -sqrt 2 ]; Unterschied ( ) und [ ]! unbenanntes Unterprogramm: $sref = sub { print "hello\n" } sub liefert Codereferenz Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 67 / 187

Unterprogramme Anonyme Referenzen unbenannte Liste: $aref = [ 42, "foo", -sqrt 2 ]; Unterschied ( ) und [ ]! unbenanntes Unterprogramm: $sref = sub { print "hello\n" } sub liefert Codereferenz Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 67 / 187

Unterprogramme De-Referenzieren Dereferenzierung per Typqualifizierer: @a = @{$arrayref}; $x = ${$scalarref}; Vereinfacht (wenn Referenz atomar): @a = @$arrayref; $x = $$scalarref; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 68 / 187

Unterprogramme De-Referenzieren Dereferenzierung per Typqualifizierer: @a = @{$arrayref}; $x = ${$scalarref}; Vereinfacht (wenn Referenz atomar): @a = @$arrayref; $x = $$scalarref; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 68 / 187

Unterprogramme Referenzen anwenden kopieren: $bref = $aref; Listen (Referenzen sind Skalare): Feldeintrag @a = ( $aref, \$liste, [ 1, "bar" ] ); @a = ( 42, "foo", -1 ); $aref = \@a; print ${$aref}[1]; # prints "foo" print $aref->[1]; # the same (using arrow operator) Feldmanipulation push @$aref, "hello"; # append "hello" to @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 69 / 187

Unterprogramme Referenzen anwenden kopieren: $bref = $aref; Listen (Referenzen sind Skalare): Feldeintrag @a = ( $aref, \$liste, [ 1, "bar" ] ); @a = ( 42, "foo", -1 ); $aref = \@a; print ${$aref}[1]; # prints "foo" print $aref->[1]; # the same (using arrow operator) Feldmanipulation push @$aref, "hello"; # append "hello" to @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 69 / 187

Unterprogramme Referenzen anwenden kopieren: $bref = $aref; Listen (Referenzen sind Skalare): Feldeintrag @a = ( $aref, \$liste, [ 1, "bar" ] ); @a = ( 42, "foo", -1 ); $aref = \@a; print ${$aref}[1]; # prints "foo" print $aref->[1]; # the same (using arrow operator) Feldmanipulation push @$aref, "hello"; # append "hello" to @a Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 69 / 187

Unterprogramme Komplexe Referenzen mehrfach referenzieren @z = ( "foo", "bar" ); $y = \@z; $x = \$y; $w = \$x; print ${${${$w}}}[0]; # prints "foo" Lists of lists (zum Beispiel Tabellen) @a = ( "foo", 42, "bar" ); @r = ( \@a, [2, 3, 5], [ "hello", \@a ]); print $r[2]->[1]->[2]; # prints "bar" print $r[2][1][2]; # arrow optional between brackets Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 70 / 187

Unterprogramme Komplexe Referenzen mehrfach referenzieren @z = ( "foo", "bar" ); $y = \@z; $x = \$y; $w = \$x; print ${${${$w}}}[0]; # prints "foo" Lists of lists (zum Beispiel Tabellen) @a = ( "foo", 42, "bar" ); @r = ( \@a, [2, 3, 5], [ "hello", \@a ]); print $r[2]->[1]->[2]; # prints "bar" print $r[2][1][2]; # arrow optional between brackets Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 70 / 187

Unterprogramme Referenz abfragen Liste Subroutine @a = ( 1, 2, 3 ); $a = \@a; $r = ref $a; # $r now "ARRAY" $sref = sub foo { print "hello"; }; $r = ref $sref; # $r now "CODE" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 71 / 187

Unterprogramme Referenz abfragen Liste Subroutine @a = ( 1, 2, 3 ); $a = \@a; $r = ref $a; # $r now "ARRAY" $sref = sub foo { print "hello"; }; $r = ref $sref; # $r now "CODE" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 71 / 187

Unterprogramme Beispiel für Referenzen sub add { my ($a, $b) = @_; foreach ( @$a ) { $_ += shift @$b; } } @x = ( 1.. 5); @y = ( 2, 3, 5, 7, 11); add(\@x, \@y); # Nebenwirkung? print "@x\n"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 72 / 187

Unterprogramme Verwendung des Ampersand Ampersand (&) qualifiziert Subroutines vermeidbar, wenn: Nutzung per Rückwärtsreferenz keine Namenskollision zu Builtins bei Aufruf mit Ampersand müssen Klammern gesetzt werden bei Aufruf ohne Ampersand dürfen Klammern fehlen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 73 / 187

Unterprogramme Verwendung des Ampersand Ampersand (&) qualifiziert Subroutines vermeidbar, wenn: Nutzung per Rückwärtsreferenz keine Namenskollision zu Builtins bei Aufruf mit Ampersand müssen Klammern gesetzt werden bei Aufruf ohne Ampersand dürfen Klammern fehlen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 73 / 187

Unterprogramme Rekursion Unterprogramme können rekursiv aufgerufen werden Speicherverbrauch und Rechenzeit beachten gegebenenfalls in Iteration wandeln Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 74 / 187

Unterprogramme Übungen Schreiben Sie ein Unterprogramm, das die Summe einer Liste berechnet Schreiben Sie ein Unterprogramm, das Minimum, Mittelwert und Maximum einer Liste berechnet. Schreiben Sie ein Unterprogramm, das die mittlere Wortlänge einer Liste berechnet. Gegeben sei eine Tabelle als Liste von Zeilen. Schreiben Sie ein Unterprogramm, das eine Liste der Spalten dieser Tabelle zurückgibt. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 75 / 187

Assoziative Felder Hashes Datenstruktur Hash assoziative Liste (Schlüssel, Wert) Skalare Aggregierter Datentyp allgemeine Zeichenketten als Schlüssel Schlüssel eindeutig Hash-Algorithmus Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 76 / 187

Assoziative Felder Hashes Datenstruktur Hash assoziative Liste (Schlüssel, Wert) Skalare Aggregierter Datentyp allgemeine Zeichenketten als Schlüssel Schlüssel eindeutig Hash-Algorithmus Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 76 / 187

Assoziative Felder Hashes Datenstruktur Hash assoziative Liste (Schlüssel, Wert) Skalare Aggregierter Datentyp allgemeine Zeichenketten als Schlüssel Schlüssel eindeutig Hash-Algorithmus Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 76 / 187

Assoziative Felder Hashes Datenstruktur Hash assoziative Liste (Schlüssel, Wert) Skalare Aggregierter Datentyp allgemeine Zeichenketten als Schlüssel Schlüssel eindeutig Hash-Algorithmus Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 76 / 187

Assoziative Felder Hashes Datenstruktur Hash assoziative Liste (Schlüssel, Wert) Skalare Aggregierter Datentyp allgemeine Zeichenketten als Schlüssel Schlüssel eindeutig Hash-Algorithmus Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 76 / 187

Assoziative Felder Hashes Datenstruktur Hash assoziative Liste (Schlüssel, Wert) Skalare Aggregierter Datentyp allgemeine Zeichenketten als Schlüssel Schlüssel eindeutig Hash-Algorithmus Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 76 / 187

Assoziative Felder Hashes Hash Verwendung Schlüssel Rechnername Artikelnummer Wort Dateiname Wert IP-Adresse Preis Anzahl übergeordnetes Verzeichnis Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 77 / 187

Assoziative Felder Hashes Hash Zugriff auf Elemente $hash{$key} geschweifte Klammern $preis{"08x15"} $preis{"47y11"} = 5.67 $p = $preis{5 + 6 * 7. "Y11"} $wert{76574351985478} vs. $wert[76574351985478] $wert{$index} Index bedeutungsfrei Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 78 / 187

Assoziative Felder Hashes Hash Zugriff auf Elemente $hash{$key} geschweifte Klammern $preis{"08x15"} $preis{"47y11"} = 5.67 $p = $preis{5 + 6 * 7. "Y11"} $wert{76574351985478} vs. $wert[76574351985478] $wert{$index} Index bedeutungsfrei Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 78 / 187

Assoziative Felder Hashes Hash Zugriff auf Elemente $hash{$key} geschweifte Klammern $preis{"08x15"} $preis{"47y11"} = 5.67 $p = $preis{5 + 6 * 7. "Y11"} $wert{76574351985478} vs. $wert[76574351985478] $wert{$index} Index bedeutungsfrei Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 78 / 187

Assoziative Felder Hashes Hash Zuweisung %hash Gesamthash %preis = ( "CPU", 99.95, "RAM", 39.90, "HD", 139.00 ) @preisliste = %preis Reihenfolge %a = %b %a = reverse %b my %price = ( CPU => 99.95, RAM => 39.90, HD => 139.00, ); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 79 / 187

Assoziative Felder Hashes Hash Zuweisung %hash Gesamthash %preis = ( "CPU", 99.95, "RAM", 39.90, "HD", 139.00 ) @preisliste = %preis Reihenfolge %a = %b %a = reverse %b my %price = ( CPU => 99.95, RAM => 39.90, HD => 139.00, ); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 79 / 187

Assoziative Felder Hashes Hash Zuweisung %hash Gesamthash %preis = ( "CPU", 99.95, "RAM", 39.90, "HD", 139.00 ) @preisliste = %preis Reihenfolge %a = %b %a = reverse %b my %price = ( CPU => 99.95, RAM => 39.90, HD => 139.00, ); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 79 / 187

Assoziative Felder Hashes Schlüssel und Werte my @k = keys %hash my @v = values %hash my $c = keys %hash my $h = %hash # true/false Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 80 / 187

Assoziative Felder Hashes Schlüssel und Werte my @k = keys %hash my @v = values %hash my $c = keys %hash my $h = %hash # true/false Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 80 / 187

Assoziative Felder Hashes Schlüssel und Werte my @k = keys %hash my @v = values %hash my $c = keys %hash my $h = %hash # true/false Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 80 / 187

Assoziative Felder Hashes Hash-Iteration while ( ( $key, $val ) = each %hash ) { print "$key => $val\n"; } foreach $key ( sort keys %hash ) { # Speicherbedarf print "$key => $hash{$key}\n"; # Interpolation } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 81 / 187

Assoziative Felder Hashes Hash-Iteration while ( ( $key, $val ) = each %hash ) { print "$key => $val\n"; } foreach $key ( sort keys %hash ) { # Speicherbedarf print "$key => $hash{$key}\n"; # Interpolation } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 81 / 187

Assoziative Felder Hashes Hashelement Existenz und Löschung $hash{"data"} = undef if ( exists ($hash{"data"}) ) { print "exists"} delete $hash{"data"} %h = () Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 82 / 187

Assoziative Felder Hashes Hashelement Existenz und Löschung $hash{"data"} = undef if ( exists ($hash{"data"}) ) { print "exists"} delete $hash{"data"} %h = () Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 82 / 187

Assoziative Felder Hashes Hashelement Existenz und Löschung $hash{"data"} = undef if ( exists ($hash{"data"}) ) { print "exists"} delete $hash{"data"} %h = () Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 82 / 187

Assoziative Felder Hashes Hashelement Existenz und Löschung $hash{"data"} = undef if ( exists ($hash{"data"}) ) { print "exists"} delete $hash{"data"} %h = () Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 82 / 187

Assoziative Felder Hashes Hash Interpolation print "$hash{$key}" print "%hash"; # oops Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 83 / 187

Assoziative Felder Hashes Hash Teilfelder %h = ( foo => 123, bar => "hello", dummy => "crash" ); @k = qw /foo bar/; @v = @h{@k}; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 84 / 187

Assoziative Felder Hashes Hash-Referenzen Übergabe von Hashes an Subroutines: in Gestalt eines Arrays: sub foo { my (%h) = @_;... }... foo( %hash ) effektiver als Referenz: sub foo { my ($href) = @_; my %h = %{$href};... }... foo( \%hash ) auch bei Rückgabe möglich: return \%h; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 85 / 187

Assoziative Felder Hashes Hash-Referenzen Übergabe von Hashes an Subroutines: in Gestalt eines Arrays: sub foo { my (%h) = @_;... }... foo( %hash ) effektiver als Referenz: sub foo { my ($href) = @_; my %h = %{$href};... }... foo( \%hash ) auch bei Rückgabe möglich: return \%h; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 85 / 187

Assoziative Felder Hashes Hash-Referenzen Übergabe von Hashes an Subroutines: in Gestalt eines Arrays: sub foo { my (%h) = @_;... }... foo( %hash ) effektiver als Referenz: sub foo { my ($href) = @_; my %h = %{$href};... }... foo( \%hash ) auch bei Rückgabe möglich: return \%h; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 85 / 187

Assoziative Felder Hashes Anonyme Hashreferenz analog zur Liste: $a = [ 13, bar, \@b ]; analog zur Liste: $h = { Name => Meyer, Vorname => Emil }; Typ der Referenz: $r = ref $h; # $r now "HASH" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 86 / 187

Assoziative Felder Hashes Anonyme Hashreferenz analog zur Liste: $a = [ 13, bar, \@b ]; analog zur Liste: $h = { Name => Meyer, Vorname => Emil }; Typ der Referenz: $r = ref $h; # $r now "HASH" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 86 / 187

Assoziative Felder Hashes Anonyme Hashreferenz analog zur Liste: $a = [ 13, bar, \@b ]; analog zur Liste: $h = { Name => Meyer, Vorname => Emil }; Typ der Referenz: $r = ref $h; # $r now "HASH" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 86 / 187

Assoziative Felder Hashes Hashreferenzen für komplexe Datenstrukturen hashes of hashes (hoh) hashes of lists (hol) lists of hashes (loh) lists of lists (lol) beliebig komplexe Datenstrukturen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 87 / 187

Assoziative Felder Hashes Hashreferenzen für komplexe Datenstrukturen hashes of hashes (hoh) hashes of lists (hol) lists of hashes (loh) lists of lists (lol) beliebig komplexe Datenstrukturen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 87 / 187

Assoziative Felder Hashes Beispiel für komplexe Datenstruktur $db = [ { ID => 12345, Name => Schulze, Fon => { Fix => [ +49201918273, +3312345678 ], Mobil => [ 01713377214 ], } }, { ID => 23456, }, ];... $id = $$db[0]{ ID }; @tel = @{$$db[0]{ Fon }{ Fix }}; print "ID=$id, Tel: @tel\n"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 88 / 187

Assoziative Felder Hashes Referenzen Beispiel: XML-Datei <computer> <pc name="anton"> <network> <ipaddress>192.168.1.101</ipaddress> <nameserver>192.168.1.1</nameserver> <nameserver>192.168.1.254</nameserver> </network> <hardware> <cpu type="quadcore" freq="2.0 GHz"/> <disk> <type>s-ata</type> <size>500 GB</size> </disk> </hardware> </pc> <pc name="bert"> </pc> </computer> Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 89 / 187

Assoziative Felder Hashes Komplexe Datenstrukturen XML use XML::Simple; # XML-Parser use Data::Dumper; # output complex data structures $x = XMLin("pc.xml"); # get XML file print Dumper($x); # show content $dns = $$x{ pc }{ anton }{ network }{ nameserver }[0]; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 90 / 187

Assoziative Felder Hashes Übungen Schreiben Sie ein Programm, das jede Zeile als ein Wort einliest und die sortierte Liste aller distinkten Wörter ausgibt! Schreiben Sie ein Programm, das jede Zeile als ein Wort einliest und für jedes Wort die Häufigkeit ausgibt! Wie kann vorab geprüft werden, ob ein Hash revertiert werden kann? Bilden Sie mit Hash-Operationen die Mengen-Operationen Vereinigung, Restmenge und Schnittmenge nach! Hund, Katze, Maus, Strauß und Kobra sind Landtiere. Hund, Katze, Maus, Robbe, Delfin und Fledermaus sind Säugetiere. Bestimmen Sie: alle Tiere Tiere, die nicht an Land leben Säugetiere, die an Land leben Schreiben Sie Unterprogramme, die Mengen als Hashes erhalten und für zwei gegebene Menge jeweils Vereinigungsmenge, Schnittmenge und Restmenge der ersten ohne die zweite Menge bestimmen. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 91 / 187

Assoziative Felder Hashes Zusatz-Übung Referenz Gegeben ist die folgende Vorgängerabhängigkeit von Programmiersprachen: %vorfahr = ( C => Fortran, C++ => C, PL/1 => Cobol, Pascal => PL/1, Fortran => Assembler, Cobol => Assembler, Java => C++, Lisp => Assembler, Prolog => Lisp, Scheme => Lisp, ); Schreiben Sie ein Programm, das für alle gegebenen Programmiersprachen jeweils die komplette Vorgängerlinie ausgibt! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 92 / 187

Assoziative Felder Hashes Zusatz-Übungen Referenzen Ein typisches Dateiformat ist das INI-Format. Es ist in Abschnitte mit Titeln in eckigen Klammern gegliedert. Darin stehen Zeilen der Form Parameter = Wert. Schreiben Sie ein Unterprogramm, das INI-Dateien einliest und als Referenz auf einen HoH zurückgibt. Nutzen Sie das Modul XML::Simple, um die oben eingelesene Datei im XML-Format abzuspeichern und das Modul Data::Dumper, um diese Datenstruktur auszugeben. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 93 / 187

Standard I/O Standard Input Lesen von stdin Kurzform while ( defined( $line = <STDIN> )) { print "$.: $line"; # $. - line number } while ( <STDIN> ) { print "$.: $_"; } # implizite Zuweisung an $_ Listenkontext foreach ( <STDIN> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 94 / 187

Standard I/O Standard Input Lesen von stdin Kurzform while ( defined( $line = <STDIN> )) { print "$.: $line"; # $. - line number } while ( <STDIN> ) { print "$.: $_"; } # implizite Zuweisung an $_ Listenkontext foreach ( <STDIN> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 94 / 187

Standard I/O Standard Input Lesen von stdin Kurzform while ( defined( $line = <STDIN> )) { print "$.: $line"; # $. - line number } while ( <STDIN> ) { print "$.: $_"; } # implizite Zuweisung an $_ Listenkontext foreach ( <STDIN> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 94 / 187

Standard I/O Diamond Operator <> Eingabe über stdin cat foo myprog.pl myprog.pl < bar Eingabe aus Dateinamen als Aufrufargument myprog.pl foo.dat bar.dat Idee: wenn stdin, dann von dort lesen wenn Dateinamen übergeben, dann aus Dateien lesen while ( <> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 95 / 187

Standard I/O Diamond Operator <> Eingabe über stdin cat foo myprog.pl myprog.pl < bar Eingabe aus Dateinamen als Aufrufargument myprog.pl foo.dat bar.dat Idee: wenn stdin, dann von dort lesen wenn Dateinamen übergeben, dann aus Dateien lesen while ( <> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 95 / 187

Standard I/O Diamond Operator <> Eingabe über stdin cat foo myprog.pl myprog.pl < bar Eingabe aus Dateinamen als Aufrufargument myprog.pl foo.dat bar.dat Idee: wenn stdin, dann von dort lesen wenn Dateinamen übergeben, dann aus Dateien lesen while ( <> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 95 / 187

Standard I/O Diamond Operator <> Eingabe über stdin cat foo myprog.pl myprog.pl < bar Eingabe aus Dateinamen als Aufrufargument myprog.pl foo.dat bar.dat Idee: wenn stdin, dann von dort lesen wenn Dateinamen übergeben, dann aus Dateien lesen while ( <> ) { print "$.: $_"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 95 / 187

Standard I/O Aufrufargumente Aufrufargumente erscheinen in @ARGV @ARGV wie normales Feld zu behandeln (shift, foreach) @ARGV = qw/foo bar/ # read from these files while ( <> ) { print "$ARGV/$.: $_"; # $ARGV - filename } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 96 / 187

Standard I/O Aufrufargumente Aufrufargumente erscheinen in @ARGV @ARGV wie normales Feld zu behandeln (shift, foreach) @ARGV = qw/foo bar/ # read from these files while ( <> ) { print "$ARGV/$.: $_"; # $ARGV - filename } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 96 / 187

Standard I/O Standard Output print "hello"; print STDOUT "hello"; # no comma! print ( 2 + 3 ) * 4 Ausgabe gepuffert, Autoflush: $ = 1 foreach ("a".. "z") {print; sleep 1} $ = 1; foreach ("a".. "z") {print; sleep 1} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 97 / 187

Standard I/O Standard Output print "hello"; print STDOUT "hello"; # no comma! print ( 2 + 3 ) * 4 Ausgabe gepuffert, Autoflush: $ = 1 foreach ("a".. "z") {print; sleep 1} $ = 1; foreach ("a".. "z") {print; sleep 1} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 97 / 187

Standard I/O Standard Output print "hello"; print STDOUT "hello"; # no comma! print ( 2 + 3 ) * 4 Ausgabe gepuffert, Autoflush: $ = 1 foreach ("a".. "z") {print; sleep 1} $ = 1; foreach ("a".. "z") {print; sleep 1} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 97 / 187

Standard I/O Formatierte Ausgabe formatierte Ausgabe analog zu C printf "hello %s, the answer is %d", $user, $n printf "pi/4 = atan(1.0) = %g", atan2(1,1) printf "n = %6d", $n; # right justified printf "%-20s", $name; # left justified printf "pi ~ %8.4f", 22/7; printf "Rabatt = %.2f%%", 3/100 $fmt = "%6d" x @num; printf $fmt, @num unshift @num, "%6d" x @num; printf @num Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 98 / 187

Standard I/O Formatierte Ausgabe formatierte Ausgabe analog zu C printf "hello %s, the answer is %d", $user, $n printf "pi/4 = atan(1.0) = %g", atan2(1,1) printf "n = %6d", $n; # right justified printf "%-20s", $name; # left justified printf "pi ~ %8.4f", 22/7; printf "Rabatt = %.2f%%", 3/100 $fmt = "%6d" x @num; printf $fmt, @num unshift @num, "%6d" x @num; printf @num Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 98 / 187

Standard I/O Formatierte Ausgabe formatierte Ausgabe analog zu C printf "hello %s, the answer is %d", $user, $n printf "pi/4 = atan(1.0) = %g", atan2(1,1) printf "n = %6d", $n; # right justified printf "%-20s", $name; # left justified printf "pi ~ %8.4f", 22/7; printf "Rabatt = %.2f%%", 3/100 $fmt = "%6d" x @num; printf $fmt, @num unshift @num, "%6d" x @num; printf @num Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 98 / 187

Standard I/O Formatierte Ausgabe formatierte Ausgabe analog zu C printf "hello %s, the answer is %d", $user, $n printf "pi/4 = atan(1.0) = %g", atan2(1,1) printf "n = %6d", $n; # right justified printf "%-20s", $name; # left justified printf "pi ~ %8.4f", 22/7; printf "Rabatt = %.2f%%", 3/100 $fmt = "%6d" x @num; printf $fmt, @num unshift @num, "%6d" x @num; printf @num Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 98 / 187

Standard I/O Formatierte Ausgabe formatierte Ausgabe analog zu C printf "hello %s, the answer is %d", $user, $n printf "pi/4 = atan(1.0) = %g", atan2(1,1) printf "n = %6d", $n; # right justified printf "%-20s", $name; # left justified printf "pi ~ %8.4f", 22/7; printf "Rabatt = %.2f%%", 3/100 $fmt = "%6d" x @num; printf $fmt, @num unshift @num, "%6d" x @num; printf @num Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 98 / 187

Standard I/O Formatierte Ausgabe formatierte Ausgabe analog zu C printf "hello %s, the answer is %d", $user, $n printf "pi/4 = atan(1.0) = %g", atan2(1,1) printf "n = %6d", $n; # right justified printf "%-20s", $name; # left justified printf "pi ~ %8.4f", 22/7; printf "Rabatt = %.2f%%", 3/100 $fmt = "%6d" x @num; printf $fmt, @num unshift @num, "%6d" x @num; printf @num Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 98 / 187

Standard I/O Interne Ausgabe Analog zu formatierter Ausgabe Erstellen von Strings zur internen Verarbeitung $pi = sprintf "%.2f", 4 * atan2(1,1); # round $date = sprintf "%.4d-%.2d-%.2d", $y, $m, $d Vorsicht: Listenkontext nicht analog zu printf Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 99 / 187

Standard I/O Interne Ausgabe Analog zu formatierter Ausgabe Erstellen von Strings zur internen Verarbeitung $pi = sprintf "%.2f", 4 * atan2(1,1); # round $date = sprintf "%.4d-%.2d-%.2d", $y, $m, $d Vorsicht: Listenkontext nicht analog zu printf Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 99 / 187

Standard I/O Interne Ausgabe Analog zu formatierter Ausgabe Erstellen von Strings zur internen Verarbeitung $pi = sprintf "%.2f", 4 * atan2(1,1); # round $date = sprintf "%.4d-%.2d-%.2d", $y, $m, $d Vorsicht: Listenkontext nicht analog zu printf Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 99 / 187

Standard I/O Übungen schreiben Sie ein Programm, das alle Aufrufargumente zeilenweise nummeriert ausgibt. Eine Datei enthält: hello world and friends was liefert die folgende Sequenz? @t = <>; print "@t" Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 100 / 187

Reguläre Ausdrücke Regulärer Ausdruck Idee Woran erkennt man: eine Zahl eine Uhrzeit eine Email-Adresse ein Absatzende? Muster! Nicht verwechseln mit Dateinamensmustern! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 101 / 187

Reguläre Ausdrücke Regulärer Ausdruck Idee Woran erkennt man: eine Zahl eine Uhrzeit eine Email-Adresse ein Absatzende? Muster! Nicht verwechseln mit Dateinamensmustern! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 101 / 187

Reguläre Ausdrücke Regulärer Ausdruck Idee Woran erkennt man: eine Zahl eine Uhrzeit eine Email-Adresse ein Absatzende? Muster! Nicht verwechseln mit Dateinamensmustern! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 101 / 187

Reguläre Ausdrücke Einfache Muster Pattern $_ = "dideldum"; if ( /del/ ) { print "passt!"; } Muster zwischen // Muster passt oder passt nicht Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 102 / 187

Reguläre Ausdrücke Einfache Muster Pattern $_ = "dideldum"; if ( /del/ ) { print "passt!"; } Muster zwischen // Muster passt oder passt nicht Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 102 / 187

Reguläre Ausdrücke Meta-Zeichen /3\.14159/ vs. /3.14159/ Punkt passt auf ein Zeichen Punkt passt auf jedes Zeichen (bis auf Zeilenende) Schutz durch \ Aber: \t Tabulator Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 103 / 187

Reguläre Ausdrücke Meta-Zeichen /3\.14159/ vs. /3.14159/ Punkt passt auf ein Zeichen Punkt passt auf jedes Zeichen (bis auf Zeilenende) Schutz durch \ Aber: \t Tabulator Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 103 / 187

Reguläre Ausdrücke Quantifizierer /fo*bar/ /fo+bar/ /fo?bar/ /fo{3}bar/ /fo{3,5}bar/ /fo{3,}bar/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 104 / 187

Reguläre Ausdrücke Quantifizierer /fo*bar/ /fo+bar/ /fo?bar/ /fo{3}bar/ /fo{3,5}bar/ /fo{3,}bar/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 104 / 187

Reguläre Ausdrücke Gruppierung /foo+/ vs. /(foo)+/ /((foo)+(bar)+)?/ /(foobardideldum)*/ passt auf "hello world"! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 105 / 187

Reguläre Ausdrücke Alternation /foo bar hello/ /foo( \t)+bar/ /foo( + \t+)bar/ /foo (and or) bar/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 106 / 187

Reguläre Ausdrücke Muster-Test #!/usr/bin/perl while ( <> ) { chomp; if ( /MUSTER/ ) { print "passt: $ <$&>$ \n" } else { print "passt nicht\n"; } } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 107 / 187

Reguläre Ausdrücke Greediness reguläre Ausdrücke normalerweise gierig (greedy) $_ = "AxyzApqrA"; /A.*A/ greedy /A.*?A/ nongreedy /A[^A]*A/ oft ähnlich wie nongreedy Matching-Variable: $, $&, $ langsam! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 108 / 187

Reguläre Ausdrücke Greediness reguläre Ausdrücke normalerweise gierig (greedy) $_ = "AxyzApqrA"; /A.*A/ greedy /A.*?A/ nongreedy /A[^A]*A/ oft ähnlich wie nongreedy Matching-Variable: $, $&, $ langsam! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 108 / 187

Reguläre Ausdrücke Greediness reguläre Ausdrücke normalerweise gierig (greedy) $_ = "AxyzApqrA"; /A.*A/ greedy /A.*?A/ nongreedy /A[^A]*A/ oft ähnlich wie nongreedy Matching-Variable: $, $&, $ langsam! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 108 / 187

Reguläre Ausdrücke Übungen Finden Sie heraus, ob Groß- und Kleinschreibung unterschieden wird! Erstellen Sie ein Muster, das auf alle phonetisch äquivalenten Schreibweisen des Eigennamens Meier passt! Erstellen Sie ein Muster, das auf die folgenden Zeichenketten passt! "\\***" +. ( ) Schreiben Sie ein Programm, das alle Zeilen der Eingabe ausgibt, die foo enthalten! Schreiben Sie ein Programm, das alle Zeilen der Eingabe ausgibt, die foo und bar enthalten! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 109 / 187

Reguläre Ausdrücke Zeichenklassen [abc] statt (a b c) [0-9], [a-xz] [0-9-] [\000-\037] (Steuerzeichen) Klasse steht für ein Zeichen Quantoren: [0-9]+ Negation: [^aeiou] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 110 / 187

Reguläre Ausdrücke Zeichenklassen [abc] statt (a b c) [0-9], [a-xz] [0-9-] [\000-\037] (Steuerzeichen) Klasse steht für ein Zeichen Quantoren: [0-9]+ Negation: [^aeiou] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 110 / 187

Reguläre Ausdrücke Zeichenklassen [abc] statt (a b c) [0-9], [a-xz] [0-9-] [\000-\037] (Steuerzeichen) Klasse steht für ein Zeichen Quantoren: [0-9]+ Negation: [^aeiou] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 110 / 187

Reguläre Ausdrücke Zeichenklassen [abc] statt (a b c) [0-9], [a-xz] [0-9-] [\000-\037] (Steuerzeichen) Klasse steht für ein Zeichen Quantoren: [0-9]+ Negation: [^aeiou] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 110 / 187

Reguläre Ausdrücke Zeichenklassen Kurzformen [0-9] \d [\da-fa-f] [a-za-z0-9_] \w [\r\n\t\f ] \s (Whitespace) \w+\s+\w+ Wort Zwischenraum Wort Negation: \d \D \s \S \w \W [\d\d]. [^\d\d] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 111 / 187

Reguläre Ausdrücke Zeichenklassen Kurzformen [0-9] \d [\da-fa-f] [a-za-z0-9_] \w [\r\n\t\f ] \s (Whitespace) \w+\s+\w+ Wort Zwischenraum Wort Negation: \d \D \s \S \w \W [\d\d]. [^\d\d] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 111 / 187

Reguläre Ausdrücke Zeichenklassen Kurzformen [0-9] \d [\da-fa-f] [a-za-z0-9_] \w [\r\n\t\f ] \s (Whitespace) \w+\s+\w+ Wort Zwischenraum Wort Negation: \d \D \s \S \w \W [\d\d]. [^\d\d] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 111 / 187

Reguläre Ausdrücke Zeichenklassen Kurzformen [0-9] \d [\da-fa-f] [a-za-z0-9_] \w [\r\n\t\f ] \s (Whitespace) \w+\s+\w+ Wort Zwischenraum Wort Negation: \d \D \s \S \w \W [\d\d]. [^\d\d] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 111 / 187

Reguläre Ausdrücke Anker Zeilenanker: Zeilenanfang: ^ /^hello/ aber: /^[^helo]/ Zeilenende: $ /world$/ /^\s*$/ Wortanker: \W+\b\w+\b\W+ /\Bmeier\b/: Obermeier aber nicht meier /\b\$\w+\b/ Perl-Skalarname? (oops!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 112 / 187

Reguläre Ausdrücke Anker Zeilenanker: Zeilenanfang: ^ /^hello/ aber: /^[^helo]/ Zeilenende: $ /world$/ /^\s*$/ Wortanker: \W+\b\w+\b\W+ /\Bmeier\b/: Obermeier aber nicht meier /\b\$\w+\b/ Perl-Skalarname? (oops!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 112 / 187

Reguläre Ausdrücke Anker Zeilenanker: Zeilenanfang: ^ /^hello/ aber: /^[^helo]/ Zeilenende: $ /world$/ /^\s*$/ Wortanker: \W+\b\w+\b\W+ /\Bmeier\b/: Obermeier aber nicht meier /\b\$\w+\b/ Perl-Skalarname? (oops!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 112 / 187

Reguläre Ausdrücke Anker Zeilenanker: Zeilenanfang: ^ /^hello/ aber: /^[^helo]/ Zeilenende: $ /world$/ /^\s*$/ Wortanker: \W+\b\w+\b\W+ /\Bmeier\b/: Obermeier aber nicht meier /\b\$\w+\b/ Perl-Skalarname? (oops!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 112 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Klammern Speicherlisten Klammern gruppieren und speichern gefundene Sequenzen Speicherung in einer Liste Ablage in der Folge der öffnenden Klammern Zugriff über: \1, \2,... innerhalb des Musters $1, $2,... außerhalb des Musters Beispielanwendung: Muster für Doppelbuchstaben. /\w\w/ zu allgemein. /(.)\1/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 113 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Rückwärtsreferenzen Referenz auf gefundene Sequenzen des Musters /(.)\1/ /^(\w+)\s+\1$/ /(hello world)(foo bar)\2\1/ /((Ober Unter)meier)\s+\2$/ Außerhalb des Musters: $1, $2, etc. Listeneinträge werden bei Bemusterung überschrieben möglichst nur kurz verwenden sichern: if ( /(\d+)/ ) {$n = $1} Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 114 / 187

Reguläre Ausdrücke Benannte Musterfolgen alternativ zur Klammerposition /(?<Wort>\w)/ /(? Wort \w)/ /(?<Wort>\w)\k<Wort>/ Rückwärtsreferenz /(?<Wort>\w)\1/ mischbar mit Positionsreferenz gespeicherte Sequenzen im Hash %+ keys %+ values %+ for (keys %+) { print "$+{$_}"} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 115 / 187

Reguläre Ausdrücke Benannte Musterfolgen alternativ zur Klammerposition /(?<Wort>\w)/ /(? Wort \w)/ /(?<Wort>\w)\k<Wort>/ Rückwärtsreferenz /(?<Wort>\w)\1/ mischbar mit Positionsreferenz gespeicherte Sequenzen im Hash %+ keys %+ values %+ for (keys %+) { print "$+{$_}"} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 115 / 187

Reguläre Ausdrücke Benannte Musterfolgen alternativ zur Klammerposition /(?<Wort>\w)/ /(? Wort \w)/ /(?<Wort>\w)\k<Wort>/ Rückwärtsreferenz /(?<Wort>\w)\1/ mischbar mit Positionsreferenz gespeicherte Sequenzen im Hash %+ keys %+ values %+ for (keys %+) { print "$+{$_}"} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 115 / 187

Reguläre Ausdrücke Benannte Musterfolgen alternativ zur Klammerposition /(?<Wort>\w)/ /(? Wort \w)/ /(?<Wort>\w)\k<Wort>/ Rückwärtsreferenz /(?<Wort>\w)\1/ mischbar mit Positionsreferenz gespeicherte Sequenzen im Hash %+ keys %+ values %+ for (keys %+) { print "$+{$_}"} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 115 / 187

Reguläre Ausdrücke Benannte Musterfolgen alternativ zur Klammerposition /(?<Wort>\w)/ /(? Wort \w)/ /(?<Wort>\w)\k<Wort>/ Rückwärtsreferenz /(?<Wort>\w)\1/ mischbar mit Positionsreferenz gespeicherte Sequenzen im Hash %+ keys %+ values %+ for (keys %+) { print "$+{$_}"} Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 115 / 187

Reguläre Ausdrücke Reguläre Ausdrücke Präzedenz 1. Klammern 2. Quantoren: (abc+) (abc)+ 3. Anker und Zeichenfolgen 4. Alternation Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 116 / 187

Reguläre Ausdrücke Übungen Worauf passt /^foo bar$/ Ein HTML-Eintrag setzt sich aus Tag und Attribut zusammen, zum Beispiel <image source="bild.jpg">. Statt Anführungszeichen dürfen auch Apostroph erscheinen. Welches Muster isoliert den Namen der Source in einer Speichervariablen? Ein anderes HTML-Konstrukt sieht den Tag am Anfang und am Ende vor, zum Beispiel <H1>Titel</H1>. Isolieren Sie den Eintrag zwischen Taganfang und -ende! Erstellen Sie ein Muster zur Erkennung gültiger Perl-Skalarnamen! Erstellen Sie ein Muster, das Zeilen mit doppelt auftretenden Wörtern erkennt! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 117 / 187

Reguläre Ausdrücke Pattern Matching /MUSTER/ als Kurzform für m/muster/ unpraktisch, wenn MUSTER Slashes enthält; alternative Muster-Begrenzer: m(muster) m!muster! m^muster^ m[muster] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 118 / 187

Reguläre Ausdrücke Pattern Matching /MUSTER/ als Kurzform für m/muster/ unpraktisch, wenn MUSTER Slashes enthält; alternative Muster-Begrenzer: m(muster) m!muster! m^muster^ m[muster] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 118 / 187

Reguläre Ausdrücke Bindungsoperator =~ Matching gegen beliebige Variable $line =~ /MUSTER/ $line =~ m(muster) Fallunterscheidung: if ( $line =~ m[muster] )... Wert des Matching-Operators: $passt = ( $line =~ /PTN/ ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 119 / 187

Reguläre Ausdrücke Bindungsoperator =~ Matching gegen beliebige Variable $line =~ /MUSTER/ $line =~ m(muster) Fallunterscheidung: if ( $line =~ m[muster] )... Wert des Matching-Operators: $passt = ( $line =~ /PTN/ ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 119 / 187

Reguläre Ausdrücke Bindungsoperator =~ Matching gegen beliebige Variable $line =~ /MUSTER/ $line =~ m(muster) Fallunterscheidung: if ( $line =~ m[muster] )... Wert des Matching-Operators: $passt = ( $line =~ /PTN/ ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 119 / 187

Reguläre Ausdrücke Pattern Matching Optionen Groß-/Kleinschreibung: m/muster/i Sonderbedeutung von Newline aufheben: m/muster/s Globales Matching: while ( /(MUSTER)/g ) { $n += 1 } Matching im Listenkontext: @a = ( $line =~ m/(muster)/g ) oder: ($a, $b) = ( $line =~ m/(m1).*(m2)/g ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 120 / 187

Reguläre Ausdrücke Pattern Matching Optionen Groß-/Kleinschreibung: m/muster/i Sonderbedeutung von Newline aufheben: m/muster/s Globales Matching: while ( /(MUSTER)/g ) { $n += 1 } Matching im Listenkontext: @a = ( $line =~ m/(muster)/g ) oder: ($a, $b) = ( $line =~ m/(m1).*(m2)/g ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 120 / 187

Reguläre Ausdrücke Pattern Matching Optionen Groß-/Kleinschreibung: m/muster/i Sonderbedeutung von Newline aufheben: m/muster/s Globales Matching: while ( /(MUSTER)/g ) { $n += 1 } Matching im Listenkontext: @a = ( $line =~ m/(muster)/g ) oder: ($a, $b) = ( $line =~ m/(m1).*(m2)/g ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 120 / 187

Reguläre Ausdrücke Pattern Matching Optionen Groß-/Kleinschreibung: m/muster/i Sonderbedeutung von Newline aufheben: m/muster/s Globales Matching: while ( /(MUSTER)/g ) { $n += 1 } Matching im Listenkontext: @a = ( $line =~ m/(muster)/g ) oder: ($a, $b) = ( $line =~ m/(m1).*(m2)/g ) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 120 / 187

Reguläre Ausdrücke Interpolation in Mustern $p = hel+o Matching: $line =~ /$p/ Muster kann veränderlich sein Mehrfachnutzung komplizierter Muster: $num = [+-]?\d+\.\d*([ee][+-]\d+)? if ( $line =~ /$num/ )... if ( $line =~ /$num/o )... (Muster fix) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 121 / 187

Reguläre Ausdrücke Interpolation in Mustern $p = hel+o Matching: $line =~ /$p/ Muster kann veränderlich sein Mehrfachnutzung komplizierter Muster: $num = [+-]?\d+\.\d*([ee][+-]\d+)? if ( $line =~ /$num/ )... if ( $line =~ /$num/o )... (Muster fix) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 121 / 187

Reguläre Ausdrücke Interpolation in Mustern $p = hel+o Matching: $line =~ /$p/ Muster kann veränderlich sein Mehrfachnutzung komplizierter Muster: $num = [+-]?\d+\.\d*([ee][+-]\d+)? if ( $line =~ /$num/ )... if ( $line =~ /$num/o )... (Muster fix) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 121 / 187

Reguläre Ausdrücke Interpolation in Mustern $p = hel+o Matching: $line =~ /$p/ Muster kann veränderlich sein Mehrfachnutzung komplizierter Muster: $num = [+-]?\d+\.\d*([ee][+-]\d+)? if ( $line =~ /$num/ )... if ( $line =~ /$num/o )... (Muster fix) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 121 / 187

Reguläre Ausdrücke Substitution Suchen und Ersetzen s/muster/ersatz/ Beispiele: s/(\w+)\s+(\w+)/$2 $1/ s/^/>>> / s/hello// s/(\w+)/\u$1/ s/\s+/_/g s(this)[that] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 122 / 187

Reguläre Ausdrücke Substitution Suchen und Ersetzen s/muster/ersatz/ Beispiele: s/(\w+)\s+(\w+)/$2 $1/ s/^/>>> / s/hello// s/(\w+)/\u$1/ s/\s+/_/g s(this)[that] Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 122 / 187

Reguläre Ausdrücke Look ahead 00:E0:7D:7D:14:D5 00-E0-7D-7D-14-D5 Idee: s/([\da-f]{2}):([\da-f]{2})/$1-$2/ig Muster Folgemuster Folgemuster wird nicht verbraucht s/([\da-f]{2}):(?=[\da-f]{2})/$1-$2/ig Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 123 / 187

Reguläre Ausdrücke Look ahead 00:E0:7D:7D:14:D5 00-E0-7D-7D-14-D5 Idee: s/([\da-f]{2}):([\da-f]{2})/$1-$2/ig Muster Folgemuster Folgemuster wird nicht verbraucht s/([\da-f]{2}):(?=[\da-f]{2})/$1-$2/ig Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 123 / 187

Reguläre Ausdrücke Look ahead 00:E0:7D:7D:14:D5 00-E0-7D-7D-14-D5 Idee: s/([\da-f]{2}):([\da-f]{2})/$1-$2/ig Muster Folgemuster Folgemuster wird nicht verbraucht s/([\da-f]{2}):(?=[\da-f]{2})/$1-$2/ig Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 123 / 187

Reguläre Ausdrücke Look ahead 00:E0:7D:7D:14:D5 00-E0-7D-7D-14-D5 Idee: s/([\da-f]{2}):([\da-f]{2})/$1-$2/ig Muster Folgemuster Folgemuster wird nicht verbraucht s/([\da-f]{2}):(?=[\da-f]{2})/$1-$2/ig Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 123 / 187

Reguläre Ausdrücke Look behind setze Leerzeichen hinter Satzzeichen grouping: s/([,;.])/$1 /g look behind: s/(?<=[,;.])/ /g setze Leerzeichen hinter Satzzeichen, aber nicht zwischen Ziffern: s/(?<=[,.](?!(?<=\d[.,])(?=\d)))/ /g Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 124 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Trennen split Trennen an Mustern @f = split /sep/, $line ($a, $b, $rest) = split /\s+/, $line, 2 @a = split /;/, ";;;foo;bar;" @a = split, $line @a = split, $line @a = split @a = split /(\s+)/ Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 125 / 187

Reguläre Ausdrücke Verbinden join Gegenstück zu split keine regulären Ausdrücke $line = join,, @a $text = join "\n", @lines Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 126 / 187

Reguläre Ausdrücke Verbinden join Gegenstück zu split keine regulären Ausdrücke $line = join,, @a $text = join "\n", @lines Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 126 / 187

Reguläre Ausdrücke Verbinden join Gegenstück zu split keine regulären Ausdrücke $line = join,, @a $text = join "\n", @lines Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 126 / 187

Reguläre Ausdrücke Transliteration y (tr) y/zeichenliste/ersatz/ zeichenweise Transliteration y/a-z/a-z/ Intervalle! Keine regulären Ausdrücke y/0-9//d alle Ziffern löschen y/\n//s mehrfache Leerzeilen zusammenfassen y/0-9//dc alle Zeichen löschen, die nicht Ziffern sind $n = y/0-9// Anzahl Ziffern Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 127 / 187

Reguläre Ausdrücke Transliteration y (tr) y/zeichenliste/ersatz/ zeichenweise Transliteration y/a-z/a-z/ Intervalle! Keine regulären Ausdrücke y/0-9//d alle Ziffern löschen y/\n//s mehrfache Leerzeilen zusammenfassen y/0-9//dc alle Zeichen löschen, die nicht Ziffern sind $n = y/0-9// Anzahl Ziffern Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 127 / 187

Reguläre Ausdrücke Transliteration y (tr) y/zeichenliste/ersatz/ zeichenweise Transliteration y/a-z/a-z/ Intervalle! Keine regulären Ausdrücke y/0-9//d alle Ziffern löschen y/\n//s mehrfache Leerzeilen zusammenfassen y/0-9//dc alle Zeichen löschen, die nicht Ziffern sind $n = y/0-9// Anzahl Ziffern Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 127 / 187

Reguläre Ausdrücke Transliteration y (tr) y/zeichenliste/ersatz/ zeichenweise Transliteration y/a-z/a-z/ Intervalle! Keine regulären Ausdrücke y/0-9//d alle Ziffern löschen y/\n//s mehrfache Leerzeilen zusammenfassen y/0-9//dc alle Zeichen löschen, die nicht Ziffern sind $n = y/0-9// Anzahl Ziffern Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 127 / 187

Reguläre Ausdrücke Übungen Zählen Sie die Wörter einer Zeile! Gegeben sei ein Text (Zeilen aus Wörtern und Daten): geben Sie den Text mit einem Wort/Datum je Zeile aus; addieren Sie die Werte aller Zahlen; erstellen Sie eine sortierte Liste mit allen großgeschriebenen Wörtern von mehr als drei Buchstaben; Geben Sie die Häufigkeit jedes Wortes unabhängig von Groß-/Kleinschreibung an; geben Sie alle Wörter an, die alle Vokale enthalten; geben Sie alle Wörter an, die die Vokale in alphabetischer Reihenfolge enthalten; geben Sie alle Wörter an, die am Ende die gleichen drei Buchstaben tragen wie am Anfang; In einer Datei wird das Komma als Dezimaltrenner benutzt. Ersetzen Sie nur diese Kommata durch Punkte. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 128 / 187

Kontrollstrukturen Mehrfache Fallunterscheidung if ( /^\$\w+$/ ) { print "identifier"; } elsif ( /^[-+*/]$/ ) { print "arithmetic operator"; } elsif ( /^\d+$/ ) { print "number"; } else { print "not recognized"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 129 / 187

Kontrollstrukturen Fallunterscheidung unless vs. if if ( $x > 3 ) { # nop } else { print "low x"; } unless ( $x > 3 ) { print "low x"; } unless ( $x > 3 ) { print "low x"; } else { print "high x"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 130 / 187

Kontrollstrukturen Fallunterscheidung unless vs. if if ( $x > 3 ) { # nop } else { print "low x"; } unless ( $x > 3 ) { print "low x"; } unless ( $x > 3 ) { print "low x"; } else { print "high x"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 130 / 187

Kontrollstrukturen Fallunterscheidung unless vs. if if ( $x > 3 ) { # nop } else { print "low x"; } unless ( $x > 3 ) { print "low x"; } unless ( $x > 3 ) { print "low x"; } else { print "high x"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 130 / 187

Kontrollstrukturen Schleife until vs. while while ( $n < 10 ) { print $n; $n += 1; } until ( $n > 10 ) { print $n; $n += 1; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 131 / 187

Kontrollstrukturen Schleife until vs. while while ( $n < 10 ) { print $n; $n += 1; } until ( $n > 10 ) { print $n; $n += 1; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 131 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Ausdrucksmodifizierer if ( $n < 0 ) { print "$n negative"} print "$n negative" if $n < 0 $n += $n until $n > 1000 &calc($_) foreach @data print "$1 numeric" if /(\d+)/ Stilmittel (Ausnahmesituationen) Kontrollausdruck wird vorab ausgewertet Bei Codeerweiterung oft Wandlung in Standardkontrollstrukturen erforderlich Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 132 / 187

Kontrollstrukturen Nackte Block-Struktur { } my $x; # local scope $x = 3 * $y + 4; print "x = $x"; nackter Block analog while-schleife ein Durchlauf lokale Variable Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 133 / 187

Kontrollstrukturen Nackte Block-Struktur { } my $x; # local scope $x = 3 * $y + 4; print "x = $x"; nackter Block analog while-schleife ein Durchlauf lokale Variable Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 133 / 187

Kontrollstrukturen Nackte Block-Struktur { } my $x; # local scope $x = 3 * $y + 4; print "x = $x"; nackter Block analog while-schleife ein Durchlauf lokale Variable Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 133 / 187

Kontrollstrukturen Nackte Block-Struktur { } my $x; # local scope $x = 3 * $y + 4; print "x = $x"; nackter Block analog while-schleife ein Durchlauf lokale Variable Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 133 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Auto-In/Decrement $n += 1 $n ++ $cnt{$_}++ foreach @word $n -- if $n > 0 $x = 3; $y = $x ++ # Postinkrement $y = ++ $x # Präinkrement $a[++ $i] = $i + $i ++ # Vorsicht(Sequenzpunkt!) Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 134 / 187

Kontrollstrukturen Schleife for(;;) for ( $s = 0, $i = 0; $i < $n; $i ++ ) { $s += $i; } $s = 0; $i = 0; while ( $i < $n ) { $s += $i; $i ++; } for (;;) {} # Endlosschleife Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 135 / 187

Kontrollstrukturen Schleife for(;;) for ( $s = 0, $i = 0; $i < $n; $i ++ ) { $s += $i; } $s = 0; $i = 0; while ( $i < $n ) { $s += $i; $i ++; } for (;;) {} # Endlosschleife Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 135 / 187

Kontrollstrukturen Schleife for(;;) for ( $s = 0, $i = 0; $i < $n; $i ++ ) { $s += $i; } $s = 0; $i = 0; while ( $i < $n ) { $s += $i; $i ++; } for (;;) {} # Endlosschleife Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 135 / 187

Kontrollstrukturen Schleife for(;;) vs. foreach() $n = 0; foreach ( @data ) { print "$n: $_"; $n ++; } for ( @data ) { # equivalent to foreach print "$n: $_"; $n ++; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 136 / 187

Kontrollstrukturen Schleife for(;;) vs. foreach() $n = 0; foreach ( @data ) { print "$n: $_"; $n ++; } for ( @data ) { # equivalent to foreach print "$n: $_"; $n ++; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 136 / 187

Kontrollstrukturen Schleifenkontrolle while ( <> ) { last if / END /; # loop exit... } # jump here while ( <> ) { s/#.*//; # ignore comment next if /^\s*$/; # ignore empty line... # jump here } while ( 1 ) { # jump here print "$x * $y =?"; $z = <>; redo unless $x * $y == $z;... } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 137 / 187

Kontrollstrukturen Schleifenkontrolle while ( <> ) { last if / END /; # loop exit... } # jump here while ( <> ) { s/#.*//; # ignore comment next if /^\s*$/; # ignore empty line... # jump here } while ( 1 ) { # jump here print "$x * $y =?"; $z = <>; redo unless $x * $y == $z;... } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 137 / 187

Kontrollstrukturen Schleifenkontrolle while ( <> ) { last if / END /; # loop exit... } # jump here while ( <> ) { s/#.*//; # ignore comment next if /^\s*$/; # ignore empty line... # jump here } while ( 1 ) { # jump here print "$x * $y =?"; $z = <>; redo unless $x * $y == $z;... } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 137 / 187

Kontrollstrukturen Schleifenkontrolle mit Labels LINE: while ( <> ) { foreach ( split ) { last LINE if /FINISH/; # nested loop } } if ( /desaster/ ) goto RESCUE; # remember Dijkstra... RESCUE: # emergency code Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 138 / 187

Kontrollstrukturen Schleifenkontrolle mit Labels LINE: while ( <> ) { foreach ( split ) { last LINE if /FINISH/; # nested loop } } if ( /desaster/ ) goto RESCUE; # remember Dijkstra... RESCUE: # emergency code Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 138 / 187

Kontrollstrukturen Do-Block $x = do { $n *= 2; $n + 3; }; do evaluiert die Statements im Block und liefert Wert des letzten Statements zurück. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 139 / 187

Kontrollstrukturen Do-Block $x = do { $n *= 2; $n + 3; }; do evaluiert die Statements im Block und liefert Wert des letzten Statements zurück. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 139 / 187

Kontrollstrukturen Do-Block mit Endbedingung do { $n += 1; $n *= 2; } while $n < 100; Modifier while mindestens ein Durchlauf do bildet keine Schleife kein last, next, redo Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 140 / 187

Kontrollstrukturen Do-Block mit Endbedingung do { $n += 1; $n *= 2; } while $n < 100; Modifier while mindestens ein Durchlauf do bildet keine Schleife kein last, next, redo Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 140 / 187

Kontrollstrukturen Do-Block mit Endbedingung do { $n += 1; $n *= 2; } while $n < 100; Modifier while mindestens ein Durchlauf do bildet keine Schleife kein last, next, redo Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 140 / 187

Kontrollstrukturen Do-Block mit Endbedingung do { $n += 1; $n *= 2; } while $n < 100; Modifier while mindestens ein Durchlauf do bildet keine Schleife kein last, next, redo Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 140 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Logische Operatoren if ( $x < 3 $x > 7 ) { print "x von 5 entfernt"; } if ( $x > 3 && $x < 7 ) { print "x nah bei 5"; } $c = $cnt{$word} unseen ; ( $a < $b ) && ( $a = $b ) # instead of if $a < $b and $a = $b # precedence Short Circuit (Teilevaluation) Seiteneffekte liefert den letzten evaluierten Ausdruck Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 141 / 187

Kontrollstrukturen Ternärer Operator if ( $x % 2 == 0 ) { $y = $x / 2; } else { $y = 3 * $x; } $y = ($x%2 == 0)? ($x/2) : (3*$x); Kurzform für if-then-else liefert Wert Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 142 / 187

Kontrollstrukturen Ternärer Operator if ( $x % 2 == 0 ) { $y = $x / 2; } else { $y = 3 * $x; } $y = ($x%2 == 0)? ($x/2) : (3*$x); Kurzform für if-then-else liefert Wert Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 142 / 187

Kontrollstrukturen Ternärer Operator if ( $x % 2 == 0 ) { $y = $x / 2; } else { $y = 3 * $x; } $y = ($x%2 == 0)? ($x/2) : (3*$x); Kurzform für if-then-else liefert Wert Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 142 / 187

Kontrollstrukturen Ternärer Operator if ( $x % 2 == 0 ) { $y = $x / 2; } else { $y = 3 * $x; } $y = ($x%2 == 0)? ($x/2) : (3*$x); Kurzform für if-then-else liefert Wert Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 142 / 187

Kontrollstrukturen Ternärer Operator if ( $x % 2 == 0 ) { $y = $x / 2; } else { $y = 3 * $x; } $y = ($x%2 == 0)? ($x/2) : (3*$x); Kurzform für if-then-else liefert Wert Lesbarkeit Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 142 / 187

Kontrollstrukturen Sortieren Operatoren sort { $a <=> $b } @numbers; sort { length $a <=> length $b or $a cmp $b } @words; sort { # Hash sort $cnt{$a} <=> $cnt{$b} or $a cmp $b } keys %cnt; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 143 / 187

Kontrollstrukturen Sortieren Operatoren sort { $a <=> $b } @numbers; sort { length $a <=> length $b or $a cmp $b } @words; sort { # Hash sort $cnt{$a} <=> $cnt{$b} or $a cmp $b } keys %cnt; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 143 / 187

Kontrollstrukturen Sortieren Operatoren sort { $a <=> $b } @numbers; sort { length $a <=> length $b or $a cmp $b } @words; sort { # Hash sort $cnt{$a} <=> $cnt{$b} or $a cmp $b } keys %cnt; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 143 / 187

Dateien File-Handles File-Handle zur Identifikation einer Datei (statt Namen) Bezeichner für File-Handles in Großbuchstaben vordefinierte File-Handles: STDIN, STDOUT, STDERR Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 144 / 187

Dateien File-Handles File-Handle zur Identifikation einer Datei (statt Namen) Bezeichner für File-Handles in Großbuchstaben vordefinierte File-Handles: STDIN, STDOUT, STDERR Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 144 / 187

Dateien File-Handles File-Handle zur Identifikation einer Datei (statt Namen) Bezeichner für File-Handles in Großbuchstaben vordefinierte File-Handles: STDIN, STDOUT, STDERR Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 144 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Dateien Öffnen und Schließen open INPUT, "data.txt" open INPUT, "<data.txt" # read open OUTPUT, ">data.txt" # write open DATA, "+<data.txt" # read AND write (binary files) open DATA, "+>data.txt" # write AND read (binary files) open LOG, ">>sys.log" # append $dat = "data.txt"; open OUT, "> $dat" close HANDLE; # asap Tipp: Textdateien nicht zum Lesen und Schreiben öffnen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 145 / 187

Dateien Fatale Fehler my $success = open DATA, "data"; if ( $success ) { # process file close DATA; } open DATA, $file or die "$0: can t open $file $! "; for ( @files ) { unless ( open DATA, $_ ) { warn "can t open $_: $!"; next; } } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 146 / 187

Dateien Fatale Fehler my $success = open DATA, "data"; if ( $success ) { # process file close DATA; } open DATA, $file or die "$0: can t open $file $! "; for ( @files ) { unless ( open DATA, $_ ) { warn "can t open $_: $!"; next; } } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 146 / 187

Dateien Fatale Fehler my $success = open DATA, "data"; if ( $success ) { # process file close DATA; } open DATA, $file or die "$0: can t open $file $! "; for ( @files ) { unless ( open DATA, $_ ) { warn "can t open $_: $!"; next; } } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 146 / 187

Dateien Verwendung von File-Handles open DATA, $file; while ( <DATA> ) {... } open LOG, "> $log"; print LOG "information"; # NO comma open OUT, ">data"; printf(out "x = %8d\n", $x); # NO comma open OUT, ">foo.dat"; print OUT "this"; open OUT, ">bar.dat"; # implies close print OUT "that"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 147 / 187

Dateien Verwendung von File-Handles open DATA, $file; while ( <DATA> ) {... } open LOG, "> $log"; print LOG "information"; # NO comma open OUT, ">data"; printf(out "x = %8d\n", $x); # NO comma open OUT, ">foo.dat"; print OUT "this"; open OUT, ">bar.dat"; # implies close print OUT "that"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 147 / 187

Dateien Verwendung von File-Handles open DATA, $file; while ( <DATA> ) {... } open LOG, "> $log"; print LOG "information"; # NO comma open OUT, ">data"; printf(out "x = %8d\n", $x); # NO comma open OUT, ">foo.dat"; print OUT "this"; open OUT, ">bar.dat"; # implies close print OUT "that"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 147 / 187

Dateien Verwendung von File-Handles open DATA, $file; while ( <DATA> ) {... } open LOG, "> $log"; print LOG "information"; # NO comma open OUT, ">data"; printf(out "x = %8d\n", $x); # NO comma open OUT, ">foo.dat"; print OUT "this"; open OUT, ">bar.dat"; # implies close print OUT "that"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 147 / 187

Dateien Standard Ausgabe-File-Handle open OUT, ">data"; select OUT; print "$x, $y, $z"; # output to OUT select OUT; $ = 1; print "$x, $y"; # to OUT, implies flush Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 148 / 187

Dateien Standard Ausgabe-File-Handle open OUT, ">data"; select OUT; print "$x, $y, $z"; # output to OUT select OUT; $ = 1; print "$x, $y"; # to OUT, implies flush Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 148 / 187

Dateien Standard-File-Handles Umleitung der Standard-I/O File-Handles erlaubt: open STDOUT, ">myfile"; print "hello\n"; # goes to myfile Scheitert die Umleitung, werden Standard-I/O File-Handles automatisch neu geöffnet Schließen der Standard-I/O File-Handles erfolgt meist bei Service-Prozessen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 149 / 187

Dateien Standard-File-Handles Umleitung der Standard-I/O File-Handles erlaubt: open STDOUT, ">myfile"; print "hello\n"; # goes to myfile Scheitert die Umleitung, werden Standard-I/O File-Handles automatisch neu geöffnet Schließen der Standard-I/O File-Handles erfolgt meist bei Service-Prozessen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 149 / 187

Dateien Standard-File-Handles Umleitung der Standard-I/O File-Handles erlaubt: open STDOUT, ">myfile"; print "hello\n"; # goes to myfile Scheitert die Umleitung, werden Standard-I/O File-Handles automatisch neu geöffnet Schließen der Standard-I/O File-Handles erfolgt meist bei Service-Prozessen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 149 / 187

Dateien Datei Tests die "file $file exists" if -e $file open "$d" unless -d $d warn "file very old" if -M HANDLE > 100 push @a, $f if -s $f > 1e6 and -A $f > 100 for ( @files ) { print "$_ lesbar" if -r } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 150 / 187

Dateien Datei Tests die "file $file exists" if -e $file open "$d" unless -d $d warn "file very old" if -M HANDLE > 100 push @a, $f if -s $f > 1e6 and -A $f > 100 for ( @files ) { print "$_ lesbar" if -r } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 150 / 187

Dateien Datei Tests die "file $file exists" if -e $file open "$d" unless -d $d warn "file very old" if -M HANDLE > 100 push @a, $f if -s $f > 1e6 and -A $f > 100 for ( @files ) { print "$_ lesbar" if -r } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 150 / 187

Dateien Datei Tests die "file $file exists" if -e $file open "$d" unless -d $d warn "file very old" if -M HANDLE > 100 push @a, $f if -s $f > 1e6 and -A $f > 100 for ( @files ) { print "$_ lesbar" if -r } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 150 / 187

Dateien Datei Tests die "file $file exists" if -e $file open "$d" unless -d $d warn "file very old" if -M HANDLE > 100 push @a, $f if -s $f > 1e6 and -A $f > 100 for ( @files ) { print "$_ lesbar" if -r } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 150 / 187

Dateien Datei Testoperatoren Op. Bedeutung -r Datei ist lesbar -w Datei ist beschreibbar -x Datei ist ausführbar -o Datei gehört dem User -e Datei existiert -z Datei ist leer -s Datei besitzt Inhalt (liefert Größe in Bytes) -f ist reguläre Datei -d ist Verzeichnis -M Dauer seit letzter Modifikation in Tagen -A Dauer seit letztem Zugriff in Tagen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 151 / 187

Dateien Datei-Eigenschaften ($dev,$ino,$mode,$nlink, $uid,$gid,$rdev, $size, $atime,$mtime,$ctime, $blksize,$blocks) = stat($filename); $size = (stat $f)[7]; $mtime = (stat _)[9]; # from last stat; faster Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 152 / 187

Dateien Datei-Eigenschaften ($dev,$ino,$mode,$nlink, $uid,$gid,$rdev, $size, $atime,$mtime,$ctime, $blksize,$blocks) = stat($filename); $size = (stat $f)[7]; $mtime = (stat _)[9]; # from last stat; faster Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 152 / 187

Dateien Datei-Eigenschaften ($dev,$ino,$mode,$nlink, $uid,$gid,$rdev, $size, $atime,$mtime,$ctime, $blksize,$blocks) = stat($filename); $size = (stat $f)[7]; $mtime = (stat _)[9]; # from last stat; faster Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 152 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Datei-Zeitmarken $mtime = (stat $file)[9]; ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime($mtime); Monat: 0 11 Jahr: ab 1900 Wochentag: 1 Montag $t = localtime($mtime); # scalar context $now = time; # Epoch, seconds since # 1970-01-01 00:00:00 UTC $now = time; $last_week = $now - 7 * 24 * 60 * 60; utime $now, $last_week, $file; # atime - now Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 153 / 187

Dateien Binärdateien Lesen: open DAT, $file; binmode DAT; # platform! read DAT, $buf, $length; close DAT; Positionieren: Schreiben: open OUT, ">$result"; binmode OUT; print OUT $buf; close OUT; open DAT, $file; read DAT, $buf, $length; seek DAT, 8, 0; # position to byte 8 # 0 - from beginning # 1 - relative to position # 2 - from end (normally negative) $pos = tell DAT; # actual position Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 154 / 187

Dateien Binärdateien Lesen: open DAT, $file; binmode DAT; # platform! read DAT, $buf, $length; close DAT; Positionieren: Schreiben: open OUT, ">$result"; binmode OUT; print OUT $buf; close OUT; open DAT, $file; read DAT, $buf, $length; seek DAT, 8, 0; # position to byte 8 # 0 - from beginning # 1 - relative to position # 2 - from end (normally negative) $pos = tell DAT; # actual position Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 154 / 187

Dateien Binärdateien Lesen: open DAT, $file; binmode DAT; # platform! read DAT, $buf, $length; close DAT; Positionieren: Schreiben: open OUT, ">$result"; binmode OUT; print OUT $buf; close OUT; open DAT, $file; read DAT, $buf, $length; seek DAT, 8, 0; # position to byte 8 # 0 - from beginning # 1 - relative to position # 2 - from end (normally negative) $pos = tell DAT; # actual position Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 154 / 187

Dateien Binärdaten wandeln open DAT, $file; read DAT, $buf, $length; @a = unpack("c4llnv", $buf); # Endianess my $buf = pack("csl", 7, 42, 12345); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 155 / 187

Dateien Binärdaten wandeln open DAT, $file; read DAT, $buf, $length; @a = unpack("c4llnv", $buf); # Endianess my $buf = pack("csl", 7, 42, 12345); Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 155 / 187

Dateien pack/unpack Formate Format A c/c s/s l/l N V f/d u x Bedeutung Text/Zeichenkette signed/unsigned char signed/unsigned short signed/unsigned long unsigned long in big Endian unsigned long in little Endian float/double in nativem Format String uuencodiert Null Byte Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 156 / 187

Dateien Übungen Schreiben Sie ein Programm, dass die Dateigrößen aller Files aus ARGV bestimmt, addiert und ausgibt. Sortieren Sie die Dateien aus ARGV nach Alter. Bei gleichem Alter sortieren Sie alphabetisch. Erstellen Sie eine Binärdatei, in der Sie den Wert der Zahl 42 im nativen Format speichern. Lesen Sie diese Datei auf einer Plattform mit anderer Endianess ein. Welchen Wert enthält die Datei? PNG-Dateien enthalten ab der Byteposition 16 die Breite und die Höhe des Bildes als big endian long. Schreiben Sie ein Programm, das für gegebene PNG-Dateien die Bildbreite und -höhe ausgibt. Überprüfen Sie, ob in den ersten 16 Bytes der String PNG steht! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 157 / 187

Verzeichnisse Dateisystem Navigation chdir "/bin" or die "can t cd: $!"; use Cwd; # package my $dir = getcwd; # where am I? use Cwd realpath ; my $abs_path = realpath $dir; aktuelles Verzeichnis festlegen/abfragen Schreiben Sie ein Programm cd.pl. Kann es das Kommando cd ersetzen? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 158 / 187

Verzeichnisse Dateisystem Navigation chdir "/bin" or die "can t cd: $!"; use Cwd; # package my $dir = getcwd; # where am I? use Cwd realpath ; my $abs_path = realpath $dir; aktuelles Verzeichnis festlegen/abfragen Schreiben Sie ein Programm cd.pl. Kann es das Kommando cd ersetzen? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 158 / 187

Verzeichnisse Dateisystem Navigation chdir "/bin" or die "can t cd: $!"; use Cwd; # package my $dir = getcwd; # where am I? use Cwd realpath ; my $abs_path = realpath $dir; aktuelles Verzeichnis festlegen/abfragen Schreiben Sie ein Programm cd.pl. Kann es das Kommando cd ersetzen? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 158 / 187

Verzeichnisse Dateisystem Navigation chdir "/bin" or die "can t cd: $!"; use Cwd; # package my $dir = getcwd; # where am I? use Cwd realpath ; my $abs_path = realpath $dir; aktuelles Verzeichnis festlegen/abfragen Schreiben Sie ein Programm cd.pl. Kann es das Kommando cd ersetzen? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 158 / 187

Verzeichnisse Dateisystem Navigation chdir "/bin" or die "can t cd: $!"; use Cwd; # package my $dir = getcwd; # where am I? use Cwd realpath ; my $abs_path = realpath $dir; aktuelles Verzeichnis festlegen/abfragen Schreiben Sie ein Programm cd.pl. Kann es das Kommando cd ersetzen? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 158 / 187

Verzeichnisse Verzeichniseinträge Globbing @files = glob("*.txt") @files = glob("/[a-m]?[f-z]*/??[a-g]*.*") relativer/absoluter Pfad Unterschied zu regulären Ausdrücken (alte)alternative Syntax: @files = <*.txt> Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 159 / 187

Verzeichnisse Verzeichniseinträge Globbing @files = glob("*.txt") @files = glob("/[a-m]?[f-z]*/??[a-g]*.*") relativer/absoluter Pfad Unterschied zu regulären Ausdrücken (alte)alternative Syntax: @files = <*.txt> Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 159 / 187

Verzeichnisse Verzeichniseinträge Globbing @files = glob("*.txt") @files = glob("/[a-m]?[f-z]*/??[a-g]*.*") relativer/absoluter Pfad Unterschied zu regulären Ausdrücken (alte)alternative Syntax: @files = <*.txt> Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 159 / 187

Verzeichnisse Verzeichniseinträge Globbing @files = glob("*.txt") @files = glob("/[a-m]?[f-z]*/??[a-g]*.*") relativer/absoluter Pfad Unterschied zu regulären Ausdrücken (alte)alternative Syntax: @files = <*.txt> Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 159 / 187

Verzeichnisse Verzeichniseinträge Globbing @files = glob("*.txt") @files = glob("/[a-m]?[f-z]*/??[a-g]*.*") relativer/absoluter Pfad Unterschied zu regulären Ausdrücken (alte)alternative Syntax: @files = <*.txt> Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 159 / 187

Verzeichnisse Directory-Handles opendir D, "/home" or die "can t open dir: $!"; for ( readdir D ) { print "$_"; } rewinddir D; # once again... closedir D; effizienter als Globbing keine Sortierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 160 / 187

Verzeichnisse Directory-Handles opendir D, "/home" or die "can t open dir: $!"; for ( readdir D ) { print "$_"; } rewinddir D; # once again... closedir D; effizienter als Globbing keine Sortierung Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 160 / 187

Verzeichnisse Verzeichnis-Traversierung use File::Find; sub wanted { print if -s $_ > 1000; } find \&wanted, "/home"; rekursive Traversierung Verwaltung vieler offener Directory-Handles Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 161 / 187

Verzeichnisse Verzeichnis-Traversierung use File::Find; sub wanted { print if -s $_ > 1000; } find \&wanted, "/home"; rekursive Traversierung Verwaltung vieler offener Directory-Handles Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 161 / 187

Verzeichnisse Verzeichnis-Traversierung use File::Find; sub wanted { print if -s $_ > 1000; } find \&wanted, "/home"; rekursive Traversierung Verwaltung vieler offener Directory-Handles Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 161 / 187

Verzeichnisse Dateien löschen unlink "data.txt"; unlink @files; unlink "directory" or warn "use rmdir"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 162 / 187

Verzeichnisse Dateien löschen unlink "data.txt"; unlink @files; unlink "directory" or warn "use rmdir"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 162 / 187

Verzeichnisse Dateien löschen unlink "data.txt"; unlink @files; unlink "directory" or warn "use rmdir"; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 162 / 187

Verzeichnisse Dateien umbenennen for $old ( @files ) { my $new = $old; $new =~ s/ //g; # delete white space # from file name next if $new eq $old; rename $old, $new; } rename "file", "/far/away"; # move Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 163 / 187

Verzeichnisse Dateien umbenennen for $old ( @files ) { my $new = $old; $new =~ s/ //g; # delete white space # from file name next if $new eq $old; rename $old, $new; } rename "file", "/far/away"; # move Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 163 / 187

Verzeichnisse Verzeichnisse erstellen, löschen und modifizieren mkdir "dir", 0755; # Permissions rmdir @dirs; # if empty chmod 0664, "file.dat"; chown $user, $group, @files Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 164 / 187

Verzeichnisse Verzeichnisse erstellen, löschen und modifizieren mkdir "dir", 0755; # Permissions rmdir @dirs; # if empty chmod 0664, "file.dat"; chown $user, $group, @files Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 164 / 187

Verzeichnisse Verzeichniseinträge Namensbestandteile use File::Basename; $fullname = basename $file; $name = basename $file, ".txt", ".dat"; $path = dirname $file; use File::Basename qw/ /; # don t import anything $fullname = File::Basename::basename $file; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 165 / 187

Verzeichnisse Verzeichniseinträge Namensbestandteile use File::Basename; $fullname = basename $file; $name = basename $file, ".txt", ".dat"; $path = dirname $file; use File::Basename qw/ /; # don t import anything $fullname = File::Basename::basename $file; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 165 / 187

Verzeichnisse Namen plattformunabhängig OO-Style use File::Spec; my $file = "work.txt"; my @dir = qw/ home user data /; my $fullname = File::Spec->catfile(@dir, $file); Methodenaufruf: Package -> Methode Dokumentation: perldoc File::Spec Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 166 / 187

Verzeichnisse Namen plattformunabhängig OO-Style use File::Spec; my $file = "work.txt"; my @dir = qw/ home user data /; my $fullname = File::Spec->catfile(@dir, $file); Methodenaufruf: Package -> Methode Dokumentation: perldoc File::Spec Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 166 / 187

Verzeichnisse Namen plattformunabhängig OO-Style use File::Spec; my $file = "work.txt"; my @dir = qw/ home user data /; my $fullname = File::Spec->catfile(@dir, $file); Methodenaufruf: Package -> Methode Dokumentation: perldoc File::Spec Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 166 / 187

Verzeichnisse Übungen Schreiben Sie ein Programm, dass die Dateien löscht, welche über die Kommandozeile angegeben sind. Schreiben Sie ein Programm, das eine Datei umbenennt, wenn zwei Dateinamen gegeben sind; Dateien in ein Zielverzeichnis verschiebt. Schreiben Sie ein Programm, das aus den gegebenen Dateinamen Leerzeichen entfernt, Groß- in Kleinbuchstaben wandelt. Schreiben Sie ein Programm, dass für alle gegebenen Dateien ein bestehendes Suffix gegen einen neuen Extender austauscht. Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 167 / 187

Prozess-Management und -kommunikation Programm-Aufrufe system Aufruf externer Programme aufgerufene Programme nutzen Standard-I/O-Kanäle des rufenden Prozesses system("date"); system("command @args"); # per Shell system("zip archiv *.txt"); # globbing by Shell system("command", @args); # direct call system("zip", "archiv", "*.txt"); # oops Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 168 / 187

Prozess-Management und -kommunikation Programm-Aufrufe system Aufruf externer Programme aufgerufene Programme nutzen Standard-I/O-Kanäle des rufenden Prozesses system("date"); system("command @args"); # per Shell system("zip archiv *.txt"); # globbing by Shell system("command", @args); # direct call system("zip", "archiv", "*.txt"); # oops Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 168 / 187

Prozess-Management und -kommunikation Programm-Aufrufe system Aufruf externer Programme aufgerufene Programme nutzen Standard-I/O-Kanäle des rufenden Prozesses system("date"); system("command @args"); # per Shell system("zip archiv *.txt"); # globbing by Shell system("command", @args); # direct call system("zip", "archiv", "*.txt"); # oops Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 168 / 187

Prozess-Management und -kommunikation Programm-Aufrufe system Aufruf externer Programme aufgerufene Programme nutzen Standard-I/O-Kanäle des rufenden Prozesses system("date"); system("command @args"); # per Shell system("zip archiv *.txt"); # globbing by Shell system("command", @args); # direct call system("zip", "archiv", "*.txt"); # oops Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 168 / 187

Prozess-Management und -kommunikation Kommandoausgaben Backquotes Weiterverarbeiten der Ausgabe externer Programme $now = date ; @lines = perldoc -t -f sin # Liste; system() verwenden, wenn Ausgabe nicht interessiert Problem bei Dialogprogrammen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 169 / 187

Prozess-Management und -kommunikation Kommandoausgaben Backquotes Weiterverarbeiten der Ausgabe externer Programme $now = date ; @lines = perldoc -t -f sin # Liste; system() verwenden, wenn Ausgabe nicht interessiert Problem bei Dialogprogrammen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 169 / 187

Prozess-Management und -kommunikation Kommandoausgaben Backquotes Weiterverarbeiten der Ausgabe externer Programme $now = date ; @lines = perldoc -t -f sin # Liste; system() verwenden, wenn Ausgabe nicht interessiert Problem bei Dialogprogrammen Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 169 / 187

Prozess-Management und -kommunikation Environment Umgebungsvariable des Prozesses: PATH usw. Zugriff per Hash ENV: $path = $ENV{ PATH }; delete $ENV{ PATH }; $ENV{ PATH }.= ":."; # dangerous $ENV{ NOTE } = interessant ; Vererbung an gerufene Prozesse Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 170 / 187

Prozess-Management und -kommunikation Environment Umgebungsvariable des Prozesses: PATH usw. Zugriff per Hash ENV: $path = $ENV{ PATH }; delete $ENV{ PATH }; $ENV{ PATH }.= ":."; # dangerous $ENV{ NOTE } = interessant ; Vererbung an gerufene Prozesse Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 170 / 187

Prozess-Management und -kommunikation Prozesse als File-Handles Standard-I/O von Prozessen als File-Handles; Von Fremdprozess lesen: open D, date ; # launch process $now = <D>; close D; # terminate other process Zum Fremdprozess schreiben: open M, mail ; print M "subject: Perl\n"; open P, prog ; # Oops - only ONE pipe! Unterschied zu Backquotes: open F, "find / -type f "; # run as separate process while ( <F> ) { print "found file $_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 171 / 187

Prozess-Management und -kommunikation Prozesse als File-Handles Standard-I/O von Prozessen als File-Handles; Von Fremdprozess lesen: open D, date ; # launch process $now = <D>; close D; # terminate other process Zum Fremdprozess schreiben: open M, mail ; print M "subject: Perl\n"; open P, prog ; # Oops - only ONE pipe! Unterschied zu Backquotes: open F, "find / -type f "; # run as separate process while ( <F> ) { print "found file $_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 171 / 187

Prozess-Management und -kommunikation Prozesse als File-Handles Standard-I/O von Prozessen als File-Handles; Von Fremdprozess lesen: open D, date ; # launch process $now = <D>; close D; # terminate other process Zum Fremdprozess schreiben: open M, mail ; print M "subject: Perl\n"; open P, prog ; # Oops - only ONE pipe! Unterschied zu Backquotes: open F, "find / -type f "; # run as separate process while ( <F> ) { print "found file $_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 171 / 187

Prozess-Management und -kommunikation Prozesse als File-Handles Standard-I/O von Prozessen als File-Handles; Von Fremdprozess lesen: open D, date ; # launch process $now = <D>; close D; # terminate other process Zum Fremdprozess schreiben: open M, mail ; print M "subject: Perl\n"; open P, prog ; # Oops - only ONE pipe! Unterschied zu Backquotes: open F, "find / -type f "; # run as separate process while ( <F> ) { print "found file $_\n"; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 171 / 187

Prozess-Management und -kommunikation Netzwerk TCP-Client #!/usr/bin/perl -w use IO::Socket; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => shift "localhost", PeerPort => shift 2345, ) or die "cannot connect"; while ( <$remote> ) { print } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 172 / 187

Prozess-Management und -kommunikation Netzwerk TCP-Server (multithreaded) #!/usr/bin/perl -w use IO::Socket; $server = IO::Socket::INET-> new( Proto => tcp, LocalPort => shift 2345, Listen => SOMAXCONN, Reuse => 1 ) or die "can t setup server"; while ($client = $server->accept()) { if ( $pid = fork ) { # parent or child? close $client; next; } printf "Connect from %s\n", $client->peerhost; while ( 1 ) { print $client localtime(). "\n"; sleep 1; } } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 173 / 187

Prozess-Management und -kommunikation Übungen Rufen Sie das Programm date aus einem Perlprogramm heraus aus! Lösen Sie die gleiche Aufgabe, nachdem Sie die PATH-Variable in Ihrem Perl-Programm gelöscht haben! Lassen Sie Ihr Programm die Ausgabe des Kommandos date interpretieren und den aktuellen Tag des Monats ausgeben! Erweitern Sie den TCP-Server so, dass er vom Client die Verzögerungszeit in der Schleife entgegennimmt. Diese Zeit sollte nie Null werden! Warum? Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 174 / 187

Referenzen erweitert Eval Block Evaluation Fehler abfangen fatale Fehler: eval { $x / $y }; warn $@ if $@ Syntaxfehler zur Laufzeit: $re = [abc) ; eval { m/$re/ }; String Evaluation Zugang zur zentralen Interpreterfunktion selbstmodifizierender Code problematisch Erzeugen von Variablen zur Laufzeit: $cmd = $x = 42 ; eval $cmd; symbolische Referenz: $r = foo ; $$r = 42; print $foo; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 175 / 187

Referenzen erweitert Eval Block Evaluation Fehler abfangen fatale Fehler: eval { $x / $y }; warn $@ if $@ Syntaxfehler zur Laufzeit: $re = [abc) ; eval { m/$re/ }; String Evaluation Zugang zur zentralen Interpreterfunktion selbstmodifizierender Code problematisch Erzeugen von Variablen zur Laufzeit: $cmd = $x = 42 ; eval $cmd; symbolische Referenz: $r = foo ; $$r = 42; print $foo; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 175 / 187

Referenzen erweitert Eval Block Evaluation Fehler abfangen fatale Fehler: eval { $x / $y }; warn $@ if $@ Syntaxfehler zur Laufzeit: $re = [abc) ; eval { m/$re/ }; String Evaluation Zugang zur zentralen Interpreterfunktion selbstmodifizierender Code problematisch Erzeugen von Variablen zur Laufzeit: $cmd = $x = 42 ; eval $cmd; symbolische Referenz: $r = foo ; $$r = 42; print $foo; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 175 / 187

Referenzen erweitert Übungen Erzeugen Sie mittels eval die Variablen $a $z und belegen Sie diese mit 1 26! Lösen Sie die vorherige Aufgabe mittels symbolischer Referenzen! Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 176 / 187

Grafische Oberflächen GUI Hello World #!/usr/bin/perl use Tk; # borrowed from TCL/Tk # implemented by # Nick Ing Simmons $top = MainWindow->new; # OO-style $hello = $top->button( -text => "hello", -command => sub{ print "Ciao\n"; exit }, ); # attributes in a hash $hello->pack; # geometry management MainLoop; # event handling Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 177 / 187

Grafische Oberflächen Editor Methode Datei laden $file = "empty"; sub fsel { $file = $top->fileselect->show; } sub load { my ($t) = @_; $t->delete( "1.0", "end" ); fsel; if (!open (FH, $file)) { my $d = $top->dialog( -text => "Tja!" )->Show; } else { while (<FH>) { $t->insert("end", $_); } close FH; } } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 178 / 187

Grafische Oberflächen Editor Methode Datei sicheren sub save { my ($t) = @_; open (FH, ">$file"); print FH $t->get("1.0", "end"); close (FH); } sub saveas { my ($t) = @_; fsel; save $t; } Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 179 / 187

Grafische Oberflächen Editor in 99 Zeilen use Tk; use Tk::FileSelect; $top = MainWindow->new; $top->title($file); $menu = $top->frame( -relief => raised, -borderwidth => 2 ); $menu->pack(-fill => x ); my $f = $menu->menubutton( -text => File, -underline => 0 ); $f->command( -label => Open, -command => sub { load $text } ); $f->command( -label => Save, -command => sub { save $text } ); $f->command( -label => Save as, -command => sub { saveas $text } ); #... Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 180 / 187

Grafische Oberflächen Editor Hauptschleife #... $f->separator; $f->command( -label => Quit, -command => sub { exit 0 } ); $f->pack(-side => left ); $text = $top->scrolled( "Text", -scrollbars => oe, -width => 80, -height => 25, -font => -*-courier-*--18-* )->pack; MainLoop; Prof. Dr.-Ing. Torsten Finke (FOM) Scriptorientierte Programmiertechnik Perl 2015-02-07 181 / 187