Die Skriptsprache Perl 8 Wolfgang Friebel DESY Zeuthen
Die Skriptsprache Perl (8) Wolfgang Friebel DESY Zeuthen
Anmerkungen zu Teil 7 n n perl -I fügt an das Feld @INC an, um @INC am Anfang zu erweitern, wird {BEGIN. . } benutzt Ein Modul wird mit h 2 xs -X -n name erzeugt u statt test. pl Subdirectory t mit Testscripten benutzen u Scripte müssen *. t genannt werden u MANIFEST anpassen und perl Makefile. pl ausführen
Wiederholung zu Teil 7 n n Klasse: Mit package definierter Namensraum Objekt: Speicherbereich, auf den ein Pointer zeigt u Pointer nicht vom Typ ref sondern vom Typ Class u mit bless erreicht ($obj={}; bless $obj, ’Class’; ) n Methode: Subroutine, die über Objekt gerufen wird u $obj->method($arg); u damit wird Class als erstes Argument übergeben u Subroutine wird in package Class gesucht
4. Vererbung n n n Vererbung in Perl ist Vererbung von Methoden Vererbung wird duch das Feld @ISA geregelt @ISA enthält Klassennamen, von denen geerbt wird package Printer; #aktuelles Package Printer @ISA=(’Net: : Node’); #Printer is a Net: : Node n Mehrfachvererbung: mehrere Elemente in @ISA=(’Net: : Node’, ’Device’); n Vererbung ist rekursiv, d. h. kann mehrstufig sein
Vererbungshierarchie n Vererbung dient zum Auffinden von Methoden u Wenn Methode nicht in aktueller Klasse u dann Suche nach Methoden zuerst in $ISA[0] u dann Suche in Eltern von $ISA[0] u dann erst Suche in weiteren Elementen von @ISA u dann Suche in Klasse UNIVERSAL u dann Suche nach Methode AUTOLOAD in Klasse u dann Suche nach Methode AUTOLOAD in Eltern u sonst Fehler
Vererbungshierarchie (2) n Vererbung ist Suche nach Methode in @ISA u Suche zuerst nach oben im Vererbungbaum u Danach Suche von links nach rechts in @ISA n n Alle Methoden erben von UNIVERSAL Wird Methode nicht gefunden, wird nach gleichen Regeln nach Methode AUTOLOAD gesucht
Die Klasse SUPER n n n SUPER ist ein Pseudo-Package Idee: Methode in übergeordneter Klasse erledigt Teilaufgabe (Delegation), Rest in aktueller Methode SUPER: : test sucht in Eltern der aktuellen Klasse u gesamte Vererbungshierarchie wird durchsucht u erste gefundene Methode test wird verwendet
Die Methode AUTOLOAD n AUTOLOAD wird gerufen, falls Methode nicht existiert n In $AUTOLOAD steht Name der fehlenden Methode ist Variable des aktuellen Packages u AUTOLOAD erhält wie üblich Klasse übergeben u $AUTOLOAD n n n Damit vor allem viele get/set Methoden realisierbar Nachteil: es wird jedesmal nach Methode gesucht AUTOLOAD für jede undefinierte Methode gerufen
Optimiertes AUTOLOAD n AUTOLOAD generiert Methode bei Bedarf u siehe n n Beispiel in ”Object Oriented Perl” S. 94/95 Zuweisung einer Subroutinendefinition zur Funktion, deren Name in $AUTOLOAD steht Lösung mit Typeglob Operator *{$AUTOLOAD} = sub {return $_[0]->{$attr}}; n Nur erster Aufruf nutzt AUTOLOAD
Automatische Methodenerzeugung n n n Klassen bestehen in einfachen Fällen aus Konstruktor und set/get Methoden für Attribute Aussehen der Methoden gleicht sich Erzeugung der Methoden nach Muster ist möglich Mehrere Module in Standard Perl und CPAN Class: : Struct in Standard Perl Class: : Method. Maker auf CPAN (hier nicht installiert)
Class: : Struct n n n Generiert Perl Code für new und Accessoren Stellt Subroutine struct bereit Einfachste Benutzung mit use Class: : Struct; struct Test => { name => ’$’, feld => ’@’ }; n Nachteil: nicht für komplexe Aufgaben geeignet
Hausaufgaben n Benutze die Klasse Super zur Erweiterung des Konstruktors new (Initialisierung von Variablen in übergeordnetem new) Erweitere das AUTOLOAD Beispiel um eigene Routinen n Warum wird im Beispie Test: : DESTROY gerufen n Definiere eine eigene Methode per Typeglob Mache Dich mit dem Modul Class: : Struct vertraut
- Slides: 12