Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7076[/thread]

Bedingtes Einbinden von Modulen?

Leser: 1


<< >> 7 Einträge, 1 Seite
Ronnie
 2005-06-26 17:12
#55726 #55726
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich möchte ein Modul einbinden, wenn es existiert, ansonsten ein anderes Modul. Passend dazu möchte ich eine Instanz erstellen, von dem aktiven Modul. Ich stelle mir das ungefähr so vor:
Code: (dl )
1
2
3
4
5
6
7
if (-e path/MyController.pm) {
use MyController;
} else {
use DefController;
}

my $cont = new MyController || newDefController;

Ist das möglich? Ich möchte das in einer Webapplikation nutzen. MyController ist eine abgeleitete Klasse von DefController und erweitert diese im allgemeinen um eigene Methoden.
pq
 2005-06-26 17:25
#55727 #55727
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
my $class = "DefController";
if (eval "use MyController") {
 $class = "MyController";
}
my $cont = $class->new;

ungetestet
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2005-06-27 11:08
#55728 #55728
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Nimm einfach require statt use, dann sollte es mit Deiner if-else-Abfrage klappen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-06-27 15:06
#55729 #55729
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Crian,27.06.2005, 09:08]Nimm einfach require statt use, dann sollte es mit Deiner if-else-Abfrage klappen.[/quote]
ich fuerchte, das wird nicht funktionieren; auch require bricht ab, wenn es das modul nicht finden/laden kann...
besser pq's loesung, oder auch:
Code: (dl )
1
2
3
4
5
my $class = do {
 eval "use MyController";
 $@ ? "DefController" : "MyController";
};
my $cont = $class->new();

und so kannst du auch spaeter abfragen, was in $class steht, und so optional die Erweiterungen verwenden
Code: (dl )
1
2
3
4
5
6
if ($class eq 'MyController') {
 $cont->somethingEnhanced();
}
else {
 $cont->basicStuff1(); $cont->basicStuff2(); ...
}

ok, $ref($cont) eq 'MyController' wuerde dasselbe machen, und das auch noch sicherer (was passiert denn, wenn es zwei verschiedene Objekte gibt? eins vom typ DevController und eins von MyController?)\n\n

<!--EDIT|Strat|1119870646-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2005-06-27 15:38
#55730 #55730
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=Strat,27.06.2005, 13:06][quote=Crian,27.06.2005, 09:08]Nimm einfach require statt use, dann sollte es mit Deiner if-else-Abfrage klappen.[/quote]
ich fuerchte, das wird nicht funktionieren; auch require bricht ab, wenn es das modul nicht finden/laden kann...[/quote]
Wenn er in der Abfrage testet, ob das Modul da ist, kann er es doch dann problemlos requiren. Oder seh ich das Problem gerade nicht?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-06-27 16:12
#55731 #55731
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Crian: stimmt auch wieder, sorry
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sri
 2005-06-27 16:21
#55732 #55732
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
UNIVERSAL::require *cough*
<< >> 7 Einträge, 1 Seite



View all threads created 2005-06-26 17:12.