Thread Bad name after... (52 answers)
Opened by bianca at 2015-02-19 12:08

Linuxer
 2015-02-19 23:31
#179751 #179751
User since
2006-01-27
3869 Artikel
HausmeisterIn

user image
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!

View full thread Bad name after...