1

パッケージ Fooを含むモジュール (例: Foo.pm ) があるとします。その中には、 foodefaultの定義を含む、多くのサブルーチン定義が存在します。

package Foo;
sub foo     { ... }
sub default { ... }

メインの perl プログラム (例: test.pl ) 内で、subref に値を割り当てて呼び出す、または default を呼び出す適切な方法は何ですか?

sub call_proc {
   my $args   = shift;
   my $subref = $args->{proc_name} // 'default';

   &$Foo::subref();                               # <====== Wrong
}
call_proc({ proc_name => q{foo} });               # make the call
4

3 に答える 3

2

私はこれを行いましたUNIVERSAL::can:

sub call_proc {
   my $args   = shift;
   my $subref = Foo->can($args->{proc_name}) // 'default';

   if ($subref) {
       &$subref();
   }
}
call_proc({ proc_name => q{foo} });      
于 2012-08-30T20:11:51.297 に答える
1

\&$name厳密な参照によってキャッチされないため、次のようになります。

sub call_proc {
   my $args     = shift;
   my $sub_name = $args->{proc_name} // 'default';
   my $sub_ref  = \&{ "Foo::" . $sub_name };
   #die if !defined(&$sub_ref);
   return $sub_ref->();
}

メソッドについて話している場合は、次のようになります。

sub call_method {
   my $args        = shift;
   my $method_name = $args->{method_name} // 'default';
   #die if !Foo->can($method_name);
   return Foo->$method_name();
}
于 2012-08-30T20:32:07.497 に答える
1

の場合、(または)$subref、現在のパッケージで呼び出された関数を呼び出そうとします。プログラムの設定方法によっては、完全修飾サブルーチン名を渡したい場合があります。some_method_name&$subref$subref->()some_method_name

call_proc( { proc_name => 'Foo::foo' });

call_procまたは、それを修飾するためにいくつかのロジックを入れます。これを行う方法については、 のqualify_sub_name関数を参照してください。Forks::Super::Util

関数への参照を安全に使用することもできます

call_proc( { proc_name => \&foo } );   # works if &foo is avail in current pkg
于 2012-08-30T20:05:24.240 に答える