Perl-Klassen und Instanzen erstellen

Package-Deklaration und der Unterschied zwischen Klassenmethoden und Methoden für die Instanz

Bevor wir beginnen, müssen wir uns damit befassen, wie Perl eine Klassenhierarchie im Dateisystem abbildet. Diese Grundkenntnis ist nämlich nicht nur für die Dateiablage wichtig, sondern auch für die Deklaration der package in der Datei selbst.

Das @INC Array

Kurzum: Das Array enthält Pfadangaben auf denen die Funktionen use, do und require aufsetzen. Betrachte untenstehende Beispiele:

use Foo;

Die Datei Foo.pm muss sich in einem Verzeichnis befinden, welches namentlich auch im @INC Pfad eingetragen ist. Gleichermaßen muss innerhalb der Datei package Foo; notiert sein.

use Foo::Bar;

Im @INC Pfad muss es ein Verzeichnis Foo geben und in diesem Verzeichnis befindet sich die Datei Bar.pm. In der Datei Bar.pm ist package Foo::Bar; notiert zum Deklarieren des Namespace..

Merke: Das @INC Array lässt sich mit use lib qw(/home /user); manipulieren. Dieses Pragma stellt sicher, dass ein Verzeichnispfad nur einmal im Array eingetragen wird. Des Weiteren wird mit der Package-Deklaration package Foo::Bar; ausgedrückt, dass Bar eine Klasse ist, die von Foo erbt.

Nachdem wir das geklärt haben, erstellen wir unsere erste Package in Datei Number.pm:

package Number;

use strict;
use warnings;

sub new{
    my $class = shift;
    my $nr    = shift || 0;
    return bless{ nr => $nr }, $class;
}

sub lfdnr{
    my $self = shift;
    return ++$self->{nr};
}

1; # use, require, do evaluieren dies zu einem wahren Wert
# Testbereich
# __END__

package main;

use strict;
use warnings;

my $n = Number->new(123);

print $n->lfdnr."\n" for 1..3;

Wenn wir die Datei ausführen, z.B. d:\>perl Number.pm sehen wir an der Ausgabe, dass die dem Konstruktor new() mitgegebene Zahl zum Initialisieren hochgezählt wird. Der Konstruktor ist eine Klassenmethode, weil sie mit dem Namen der Klasse aufgerufen wird:

my $n = Number->new(123);

Wobei der Pfeil-Operator -> dafür sorgt, dass der Name der Klasse als erstes Argument übergeben wird.

Merke: Der Konstruktor als Klassenmethode wird mit dem Namen der Klasse aufgerufen und gibt eine Instanz der Klasse zurück. Die Instanz einer Perl-Klasse, auch als Objekt bezeichnet, ist grundsätzlich eine Referenz, die mittels der Funktion bless() mit dem Namen der Klasse gesegnet wurde.

Die zweite Methode, hier im Beispiel lfdnr() ist eine Objektmethode weil sie über die Instanz aufgerufen wird. Auch hierbeit sorgt der Arrow-Operator dafür, dass die Instanz als erstes Argument übergeben wird.

Literatur

Eric Foster-Johnson, Perl Module. ISBN 3-8266-0570-5


Anbieter: nmq​rstx-18­@yahoo.de, die Seite verwendet funktionsbedingt einen Session-Cookie und ist Bestandteil meines nach modernen Aspekten in Perl entwickelten Frameworks.