2016-03-24 4 views
1

私は、同じインターフェースを共有するパッケージを扱っています。私は正確にクラスのメソッドサブルーチンなく呼び出す必要が文字列を使ってクラスサブルーチンを実行する

#!/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}; 

:私は、この例のようなもの、すなわち、異なるクラス名に同じサブルーチンを実行する必要があり、それを動的にしたいです。どのように私はこれを達成することができる?最後の2行

ため

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

または

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 some_sub' でCLIから上記のスクリプトを実行しています Mod1.pmは次のようになります。

package Mod1; 

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

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

1; 

Mod2.pmコードは次のとおりです。

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)を探しているようです。 'eval'では任意の文字列をPerlコードとして実行できます。 – PerlDuck

+0

evalなしで行うことはできますか? –

+2

@PerlDog OPがコマンドラインから引数を受け入れているのでかなり危険です。ディスパッチテーブル(およびおそらくAUTOLOAD)が良いでしょう。 – ThisSuitIsBlackNot

答えて

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

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

%のMod1 ::トップレベルのハッシュであるだけでなく、%でのキー/値の主である::ので、私達はちょうどキーとインデックスのハッシュを作成する必要があります。いいえeval()が必要です。

EDIT

私は深くネストされたパッケージの例を試してみましたが、同じ基本的な考え方は、動作するようです:エラーは、私はそれが何を期待して関数を呼び出していないためです

% 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. 

が、ポイントは私が関数を呼び出すことができます。

+0

涼しいアプローチですが、これはスクリプト例であり、実際のコードでは適用できません。手伝ってくれますか?私はLendingClubパッケージに以下のようなコードを書いています: '$ nmzed - > $ field($ Wrapper :: LendingClub :: {" $ {nmz} :: "} {from_string}($ lc - > {$ lc_field})); 'メッセージで実行できません_" lib/Wrapper/LendingClub.pm行140のサブルーチン参照として未定義の値を使用できません "_ $ nmzには正しいパッケージ名が含まれています。 –

+0

アイデアがありました、ありがとう –

関連する問題