[Dresden-pm] Frage zur Implementation von einer Schnittstelle - Nachtrag

Hans-Dietrich Kirmse hd.kirmse at gmx.de
So Okt 30 13:39:34 PDT 2011


nochmal hallo,

ich habe mir jetzt nach dem Vorschlag von Steffen mit dem 'eval' und 
einen Hinweis aus dem schon angegebenen Buch eine Lösung gebastelt.

Am 30.10.2011 19:28, schrieb Hans-Dietrich Kirmse:

> ... Habe aber das Buch "Perl - Best
> Practices" von Damian Conway und auch "Perl Hacks ..." mit D.C. als
> Mitautor.

in "Perl Hacks ..." findet sich Hack 72. Dort wird getestet, ob in einem 
Package eine bestimmte Funktion vorhanden ist. (Im einem foo-Magazin 
findet sich dazu auch eine Seite von Renée Bäcker.) Zusammen ergibt das 
bei mir folgenden (Beispiel-)Code:

~~~~~~~~~~~~~~~~~~~~~~~~ Addon.pm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#!/usr/bin/perl
use warnings;
use strict;

package Addon;

BEGIN {
   use Exporter ();
   use vars     qw ( @ISA @EXPORT_OK $VERSION );
   $VERSION     = '0.1';
   @ISA         = qw ( Exporter );
   @EXPORT_OK   = qw ( meine_funktion );
}

sub meine_funktion {
   print "hallo Super-Welt\n";
}

1;

__END__


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Nun ein Mini-Programm, was diese Funktion nutzt, falls es diese findet. 
Wenn die nicht gefunden wird, dann wird eine eigene Funktion genutzt:

~~~~~~~~~~~~~~~~~~~~~~~~ test.pl ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#!/usr/bin/perl
use warnings;
use strict;

my ($my_ref, $funktion_ref);

# wir versuchen das Modul zu laden
eval {
   require Addon;
};
# wenn kein Fehler
unless ($@) {
   # testen wir auf das Vorhandensein der Funktion
   $my_ref = Addon->can('meine_funktion');
   # wenn definiert, dann Funktion aus dem Modul
   if ($my_ref) {
     $funktion_ref = \&Addon::meine_funktion;
   }
   # sonst vorhandene Funktion verwenden
   else {
     $funktion_ref = \&meine_funktion;
   }
}
# wenn Modul nicht geladen
else {
   # dann auch vorhandene Funktion verwenden
   $funktion_ref = \&meine_funktion;
}

# jetzt die Funktion aufrufen
&$funktion_ref;

############ Ende des Hauptprogramms ######################


sub meine_funktion {
   print "hallo Welt\n";
}

__END__


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Es kommt hier "hallo Super-Welt". Benenne ich im Modul die Funktion um, 
dann kommt nur "hallo Welt". Gleiches gilt, wenn ich ein 
nichtvorhandenes Modul aufrufe.

Bei mir hat das mit "use" nicht geklappt, sondern nur mit "require". 
Allerdings scheint das alle meine Anforderungen zu erfüllen. Will sagen: 
ich gebe das Paket und die Funktion vor. Wird ein solches installiert, 
dann wird das auch genutzt. Wenn kein solches Paket installiert wird, 
dann wird meine Funktion genutzt.


Damit habe ich für mein (einfaches) Problem eine Schnittstelle. Ich 
bedanke mich bei allen fürs Mitdenken.

Viele Grüße
Hans-Dietrich


Mehr Informationen über die Mailingliste Dresden-pm