25

私はPerlのテストフレームワークに取り組んでいます。テストの一部として、特定のテストに前提条件または事後条件のチェックを追加する必要がある場合がありますが、必ずしもすべてのテストに追加する必要はありません。私がこれまでに得たものは次のようなものです:

eval "&verify_precondition_TEST$n";
print $@ if $@;

残念ながら、関数が存在しない場合、これは「...で呼び出された未定義のサブルーチン&verify_precondition_TEST1」を出力します。

関数を呼び出そうとする前に、関数が存在するかどうかを事前に判断するにはどうすればよいですか?

4

4 に答える 4

18
sub function_exists {    
    no strict 'refs';
    my $funcname = shift;
    return \&{$funcname} if defined &{$funcname};
    return;
}

if (my $subref = function_exists("verify_precondition_TEST$n") {
    ...
}
于 2009-01-12T01:21:48.610 に答える
5

レオンのアプローチを使用していましたが、複数のパッケージがあると失敗しました。正確な理由はわかりません。名前空間間のスコープの伝播に関連していると思います。これが私が思いついた解決策です。

my %symbols = ();
my $package =__PACKAGE__; #bring it in at run-time
{
    no strict;
    %symbols = %{$package . "::"}; #See Symbol Tables on perlmod
}
print "$funcname not defined\n" if (! defined($symbols{$funcname});

参照: perlmod ページの
__PACKAGE__参照。

Perl Training Australia のPackages/__PACKAGE__リファレンス。

于 2009-08-04T17:58:40.810 に答える