Thread Bad name after...
(52 answers)
Opened by bianca at 2015-02-19 12:08
Ich würde es so wohl nie verwenden, sondern das Konzept ändern.
Aber mit einem String-eval() wäre es wohl machbar. edit1: Aber auch diese Lösung ändert mehr als nur die for-Schleife, nämlich auch den Dispatcher-Array./edit1 edit2: Nach meinem Verständnis sehe ich bei Deiner Dispatch_Tabelle das Problem, dass Du eine Code-Referenz erzeugst, die auf die testsub des Namensraums main:: verweist; also auf main::testsub. Die einzubindenden Subroutinen aus Deinen weiteren Dateien sind noch gar nicht bekannt. Ausserdem hast Du mit einer Coderef nicht den Namen der gewünschten Routine, sondern exakt die Sprungadresse, an der diese Routine, in diesem Fall main::testsub, zu finden ist, um genau diese Routine eben aufzurufen. Du wirst meiner Ansicht nach nicht um das Anpassen an zwei Stellen herum kommen./edit2 Testskript x5.pl: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #! /usr/bin/perl -I. use strict; use warnings; use 5.010.000; my @dispatch = ( { file => 'x5-1.pl', subroutine => 'foo', # string here, not coderef } ); sub foo { say "wrong sub"; } for my $ref ( @dispatch ) { package MyModule; # declare package to contain imported functions require $ref->{file}; # import function(s) eval $ref->{subroutine}."('a')"; # call function with string-eval; remember to insert error handling # We are inside package MyModule, so no need for package name in string } say "At the end:"; # just a check what happens now with main::foo foo( 'b' ); say "Last Test:"; # and a final test MyModule::foo( 'c' ); Skript x5-1.pl Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 #! /usr/bin/perl use strict; use warnings; use 5.010.000; sub foo { say "sub $_[0]"; } 1; Last edited: 2015-02-20 00:16:29 +0100 (CET) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |