2016-03-24 17 views
1

Aynı arabirimi paylaşan bir grup paketle çalışıyorum. Ben bu örnekte olduğu gibi, yani bir şey farklı sınıf isimlerine aynı alt programı çalıştırır ve dinamik olmak için gereken:Sınıf alt yordamını yürütmek için dize kullanılıyor

#!/usr/bin/env perl 

use Modern::Perl; 
use Data::Dumper; 

use Mod1; 
use Mod2; 

my $mod = $ARGV[0]; 
my $meth = $ARGV[1]; 

${mod}::some_sub; 
${mod}::${meth}; 

Ben tam çağrı altprogramlar ve bir sınıf yöntem gerekir. Bunu nasıl başarabilirim? zaman bir sonraki mesaj ile komut yürütme hatası alıyorum argümanların Mod1 some_sub 'ile CLI Yukarıdaki scriptinizi ediyorum: Geçen 2 hat

için

Bad name after :: at ./test.pl line 13. 

veya

Bareword found where operator expected at ./test.pl line 12, near "${mod}::some_sub" 
    (Missing operator before ::some_sub?) 
syntax error at ./test.pl line 12, near "${mod}::some_sub" 
Execution of ./test.pl aborted due to compilation errors. 

Mod1.pm şunun gibi görünür:

package Mod1; 

use Modern::Perl; 
use Data::Dumper; 

sub some_sub { 
    say Dumper(\@_); 
    say 'in some_meth'; 
} 

1; 

Ve Mod2.pm kodunun yanında:

package Mod2; 

use Modern::Perl; 
use Data::Dumper; 

sub other_meth { 
    say Dumper(\@_); 
    say 'other'; 
} 

1; 
+0

['eval'] (http://perldoc.perl.org/functions/eval.html) aramayı bekliyorsunuz. "Eval" ile Perl kodu olarak keyfi dizeleri çalıştırabilirsiniz. – PerlDuck

+0

Değerlendirmeden yapmak mümkün mü? –

+2

@PerlDog OP, komut satırından argümanları kabul ettiği için oldukça tehlikeli olurdu. Bir sevk tablosu (ve muhtemelen AUTOLOAD) daha iyi olurdu. – ThisSuitIsBlackNot

cevap

0
$main::{"${mod}::"}{some_sub}(); 

$main::{"${mod}::"}{$meth}(); 

% Mod1 :: üst düzey karma ama aynı zamanda ana :: yüzden biz sadece anahtarı ve indeks karma telafi etmek gerek% anahtar/değerdir. eval() gerekli.

DÜZENLEME

Ben derinden iç içe paket örnek çalıştı ve aynı temel fikir iş gibi görünüyor:

% perl 
use ExtUtils::CBuilder::Platform::darwin; 
$nmz = 'darwin'; 
$ExtUtils::CBuilder::Platform::{"${nmz}::"}{compile}(); 
Can't call method "SUPER::compile" on unblessed reference at /System/Library/Perl/5.16/ExtUtils/CBuilder/Platform/darwin.pm line 18. 

hata benim o beklediğini ile işlevini çağırarak değil nedeniyle ancak Bu noktada işlevi çağırmayı başardım.

+0

Cool yaklaşım ama bu bir örnek komut dosyasıydı ve bunu gerçek bir kodda uygulayamıyorum. Yardım edebilir misin? LendingClub paketinde böyle bir kod var: $ nmzed -> $ alan ($ Wrapper :: LendingClub :: {"$ {nmz} ::"} {from_string} ($ lc -> {$ lc_field})); 've" _ $ nmz lib/Wrapper/LendingClub.pm satırında bir altprogram referansı olarak tanımlanamaz bir değer kullanamazsınız. "_ $ nmz doğru paket adını içerir. –

+0

Bir fikrim var, teşekkürler –

İlgili konular