Schrift
[thread]5890[/thread]

Modul-Routine mit dynamischem Namen aufrufen: @asd = Modul::$Routine();



<< >> 8 Einträge, 1 Seite
stefank86
 2003-11-08 13:29
#70469 #70469
User since
2003-10-13
27 Artikel
BenutzerIn
[default_avatar]
Hallo alle miteinander!

Ich habe ein Script, in dem der Wert einer Variable entscheidet, welche Routine eines Moduls aufgerufen wird.
Code: (dl )
@asd = Modul::$Routine();

Das führt zur Fehlermeldung "Bad name after...".

Gibt es eine Möglichkeit, diesen Fehler zu beheben?
steinwolf
 2003-11-08 14:25
#70470 #70470
User since
2003-08-04
367 Artikel
BenutzerIn
[default_avatar]
Vielleicht solltest du eine skalare Variable verwenden?!?
Poste doch mal den relevanten Code.
"Did you know? You can use your old motor oil to fertilize your lawn." - Blinkster - Professionelles EDV Forum
jan
 2003-11-08 14:43
#70471 #70471
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
eval?
oder eine art switch-statement, ich meine, im wiki sind dazu mehrere lösungen zu finden...
Dubu
 2003-11-08 15:04
#70472 #70472
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=stefank86,08.11.2003, 12:29]
Code: (dl )
@asd = Modul::$Routine();

Das führt zur Fehlermeldung "Bad name after...".[/quote]
Meinst du den Skalar $Modul::Routine oder die Funktion Modul::Routine()? Und du willst das einem Array zuweisen?

Edit: Ah, jetzt verstehe ich.
Nein, du musst dann schon dem Skalar $Routine vorher einen Verweis auf die passende Routine zuweisen, z.B. so:
Code: (dl )
1
2
3
$Routine = \&Modul::IrgendeineRoutine;
# ...
@asd = $Routine->();
\n\n

<!--EDIT|Dubu|1068296816-->
Strat
 2003-11-08 15:10
#70473 #70473
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich verstehe noch nicht so ganz, worauf du hinauswillst.

1. ein Modul mit Namen, der in einer Variablen steht, kann man mit
require "$modul.pm" oder so laden. Und dann kannst du auch durch $modul herausfinden, was fuer ein Modul (hoffentlich) geladen wurde.
2. Wenn du wissen willst, von welchem Package ein Objekt ist, kannst du das mit ref($object) herausfinden
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
jan
 2003-11-08 15:24
#70474 #70474
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich denke, es geht eher darum, dass der modul-name bekannt ist aber die sub innerhalb des bekannten moduls nicht bekannt ist.

dubu's vorschlag ließe sich vielleicht einfach als hash einsetzen, der als keys die sub-namen hat...
stefank86
 2003-11-08 18:10
#70475 #70475
User since
2003-10-13
27 Artikel
BenutzerIn
[default_avatar]
Genau so meine ich es. Das Modul ist bekannt, nur welche Routine verwendet werden muss, wird erst durch den Benutzer entschieden.

Deinen Lösungsvorschlag verstehe ich allerdings nicht ganz.
pq
 2003-11-08 18:46
#70476 #70476
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
objektorientiert:
if (my $code = $object->can($subname)) { $code->($par1,$par2) }
oder mit package-namen:
if (my $code = Modul::Name->can($subname)) { $code->($par1,$par2) }
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
<< >> 8 Einträge, 1 Seite



View all threads created 2003-11-08 13:29.