Perl5 OOP Overload und für was das gut ist
Der Kontext bestimmt das was die Instanz zurückgibt, ein Scalar oder sich selbst
- Abstrakte Datentypen in c deklarieren und in Dateien speichern
- Bilder verkleinern mit Perl und GD Library
- Bilder verkleinern, Thumbnails erzeugen mit PHP
- Binary und UTF-8 in MySQL Tabellen speichern
- CGI/1.1 Der Standard Common Gateway Interface
- CPAN Module Device::USB für Win32 compilieren und installieren
- Dateinamen in UTF-8 auf beliebigen Betriebssystemen
- Datentypen haben plattformübergreifend stets dieselbe Byte-Länge
- Datum als lange Zählung und Uhrzeit in dezimaler Darstellung
- Den Zustand von Checkboxen numerisch kodieren
- Der letzte Rest: GET, PUT, POST, DELETE ...
- Der richtige Umgang mit Binaries in C und in Perl
- Die Multi-Media-Mail-Datei der Zukunft, SMS, MMS, Internet-Mail
- Drucken auf einen Netzwerkdrucker mit Perl
- Ein eigenes Forum programmieren, Zustandsmodell einer Webanwendung
- Entwickeln auf dem Lokalen Rechner, dem localhost
- Ganze Zahlen in Dateien Schreiben in Programmiersprachen c, Perl usw.
- Globale Variablen der main-Class in einem Objekt bündeln
- HTTP/1.1 Multiple Request, Persistent Connection und Pipelining
- Hash-Slices erleichtern den wahlfreien Zugriff
- Interne Zeichenkodierung, Characters, Bytes und Bytesemantics
- Julianischen und Gregorianischen Kalender berechnen mit C
- Just another OOP Tutorial for Perl
- Little Endian, Big Endian
- Locken von Dateien für atomare Lese- und Schreibzugriffe
- Modern Perl, Modern Style, Perl OOP, TDD
- Nameserver-Abfragen, UDP mit Perl und mit C
- PHP serialize, unserialize ineffizient
- Perl OOP: Getter automatisieren ohne Gettermethoden zu definieren
- Perl's Exception::Class oder Exceptions klassifizieren
- Perl-Äquivalent zu PHP __toString()
- Perl5 OOP Overload und für was das gut ist
- Perl6 Perls Zukunft oder ein totgeborenes Kind
- Perl: Dependency Injection als Design Pattern
- Perl: Referenzen auf Variablen und Funktionen
- RFC gerechte Formate für Datum und Zeit
- RTSP Real Time Streaming Protocol leicht verständlich
- Random Access, Persistenz und ein Schichtenmodell
- Schlüselparameter, Zweckbestimmung und Umgang
- Serialize Algorithmen leicht verständlich, Binary safe Read and Write
- Serverumgebung nach CGI/1.1
- Simple Mail Transfer Protocol einfach erklärt
- Transformation von Datenstrukturen für eine transportgerechte Verpackung
- Warum ein Data Abstraction (Access) Layer
- Webformulare und Fehlerbehandlung beim Senden der Daten mit Ajax
- Welche Zutaten stecken in Erbsensuppe oder Bratkartoffeln
- XML und der Unsinn, Random Access auf Dateiebene abzubilden
- Anwendungsbeispiele und Programmieren mit JavaScript
- Mein Framework gibt es auch in PHP
- Perl ist meine erste Wahl zum Programmieren von Webanwendungen
Zur Demonstration, was Overload bewirkt, betrachte untenstehenden Code einer main-Klasse:
package main;
use strict;
use warnings;
use base 'Scaliger';
sub bool{ shift };
use overload (
'""' => sub{
my $self = shift;
return $self->jd();
}
);
# Übergeben wurde der Package-Name
# die Instanz wird hier erstellt
sub date2jd{
my $pkg = shift;
my $self = $pkg->new(@_);
return $self;
}
print
main->date2jd();
# heutiger julianischer Tag
# wird ausgegeben
Erläuterungen Schritt für Schritt
Als Erstes wird mit use base 'Scaliger';
festgelegt, daß die zum Script gehörige main-Klasse von der Klasse Scaliger
erbt. Da mit dem Antritt der Erbschaft auch der Konstruktor geerbt wird, kann dieser mit $pkg->new(@_)
innerhalb der eigens definierten Methode date2jd()
unmittelbar aufgerufen werden. Somit wird letztendlich beim Aufruf dieser Methode mit dem Namen der Package main main->date2jd();
eine explizites Erstellen einer Instanz umgangen.
Die Methode date2jd()
gibt also die gerade eben erstellte Instanz selbst zurück. In der print main->date2jd()
Ausgabe jedoch erscheint der Julianische Tag. Zum Verständnis, warum das so ist, betrachten wir die weiter obenstehende Definition für's Overload, die dem print-Kontext '""'
(Literalausgabe) eine entsprechende Funktionsreferenz zuweist. Innerhalb dieser Methode nun wird wie gewöhnlich die Instanz selbst aus der Argimentenliste extrahiert. Zu guter Letzt wird mit dieser Instanz eine geerbte Methode jd()
aufgerufen welche schließlich den julianischen Tag zurückgibt.
Entsprechend dem Konstruktor der Basisklasse kann selbstverständlich auch die Übergabe eigener Argumente erfolgen:
print
main->date2jd( date => '4.10.1582' );
# 2299160
Abschließend noch ein Beispiel zur expliziten Erstellung der Instanz:
my $dateobject = main->date2jd( date => '4.10.1582' );
printf "Kalender: %s, Julianischer Tag: %d",
$dateobject->age(), $dateobject->jd();
# Kalender: J, Julianischer Tag: 2299160
# anderes Beispiel:
my $dateobject = main->date2jd( date => '15.10.1582' );
printf "%s, Julianischer Tag: %d",
$dateobject->age() eq 'J' ?
'Julianischer Kalender' : 'Gregorianischer Kalender',
$dateobject->jd();
# Gregorianischer Kalender, Julianischer Tag: 2299161
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de.