1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/usr/bin/perl use strict; use warnings; my @dispatchtab = ( { moduldatei => 'test_extern.pl', aufruf => \&testsub, }, { moduldatei => 'test_extern2.pl', aufruf => \&testsub, }, ); for my $ref (@dispatchtab) { my $script = 1; eval <<"EVAL_CODE"; require "$ref->{moduldatei}" or $script = 0; EVAL_CODE if ($script) { print $ref->{aufruf}->('a'); } }
1 2 3 4 5 6 7 8
#!/usr/bin/perl use strict; use warnings; sub testsub { return "Gewonnen! Sub $_[0]\n"; } return '1';
Quoteabfangen und vor allen Dingen das Script nicht sterben lassen?Undefined subroutine &main::testsub called at test.pl line 20.
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 use strict; use warnings; my @dispatchtab = ( { moduldatei => 'test_extern.pl', aufruf => \&testsub, unit => 'test1', }, { moduldatei => 'test_extern2.pl', aufruf => \&testsub, unit => 'test2', }, ); for my $ref (@dispatchtab) { my $source = do{ my $fh = IO::File->new; $fh->open($ref->{moduldatei},'r') or die $!; read($fh, my $buffer, -s $fh); $fh->close; "package $ref->{unit};\n".$buffer; }; eval "$source"; UNIVERSAL::can($ref->{unit},$ref->{aufruf}); # statt $ref->{moduldatei} print $ref->{aufruf}->('a'); }
perldoc UNIVERSALCode: (dl )1
2
3
4
5
6
7
8...
$sub = Class->can("print");
$sub = eval { $ref->can("fandango") };
$ver = $obj->VERSION;
# but never do this!
$is_io = UNIVERSAL::isa($fd, "IO::Handle");
$sub = UNIVERSAL::can($obj, "print");
2015-02-23T12:34:26 Muffiedit: stackoverflow.