2016-02-08 2 views
2

Я хочу, чтобы создать динамическое имя подпрограммы в Perl, вот пробный код, я получаю ошибку «Bad имя после feed_load ::»Как создать динамическое имя подпрограммы в Perl

#!/usr/bin/perl 
use strict; 
use warnings; 

BEGIN { 
     push @INC, '/freespace/attlas/data/bin/genericLoader /FeedLoaderLib/' 
} 

use feed_load; 
my type ="L"; 
my $tempTablefunct = "Create".$type."Temp_Table"; 

feed_load::&$tempTablefunct->($tablename); ### pass a dynamic sub name HERE ### 
+2

Почему вы пытаетесь это сделать? Это, наверное, плохая идея. – Sobrique

+0

На самом деле я создаю динамическое имя подпрограммы, например: «CreateLTemp_Table» в этом месте «L», он также может прийти «P», поэтому он становится «CreatePTemp_Table» .. – chaya

ответ

7
&{ $pkg_name."::".$sub_name }(@args) 

или

($pkg_name."::".$sub_name)->(@args) 

Они будут терпеть неудачу, однако, потому что вы просили Perl запретить вам делать это путем размещения use strict; в вашей программе. Вы можете отключить use strict; локально

my $ref = do { no strict 'refs'; \&{ $pkg_name."::".$sub_name } }; 
$ref->(@args) 

Но оказывается, что \&$sub_name уже освобождены от стриктур.

my $ref = \&{ $pkg_name."::".$sub_name }; 
$ref->(@args) 

Если вместо суб вызова, вам необходимо вызова метода, вы можете использовать

my $ref = $o->can($method_name); 
$o->$ref(@args) 

или просто

$o->$method_name(@args) 
+0

Спасибо, что это решение работает для меня – chaya

Смежные вопросы