0

基本的に、変数/スカラーのみを使用してパッケージ関数を呼び出そうとしていますが、「エラー:括弧内の引数が正しくありません」というメッセージが表示される理由がわかりません。

サンプルの午後は次のとおりです。

package foo;

sub bar {

    my $request = @_[0];

    if ($request eq 'fubar') {

        my $response = 'definitely';
        return $response;

    else {

        my $response = 'definitely not';
        return $response;

    }

}

1;

そしてサンプルpl

use strict;
use lib "/blah/blah/custom_modules";
use sample;

my $package = 'foo';
my $package_sub = 'bar';
my $package_sub_args = 'fubar';     
my $response = $package->$package_sub("$package_args");
print "$response\n";

そして、エラーが発生します。

ただし、次のバリエーションを使用すると機能します。

my $response = foo::bar('fubar');
my $response = foo::bar($package_sub_args);

しかし、上記のOO表記のタイプでは変数を使用できないため、->表記を使用する必要があると思います。

とにかく、非常に感謝するのを手伝ってください。

明確化-私が抱えている問題は、実行時までパッケージ、サブ、または引数を知らないことです。subが引数を必要としないときにそれを機能させることができます。しかし、私は引数を必要とするいくつかの潜水艦を持っています、そしてそれは私がつまずいているところです...

4

2 に答える 2

0

これはもっと簡単です:

my $package_sub_ref = \&{ $package . '::' . $package_sub };
my $response = $package_sub_ref->($package_sub_arg);

strictで動作します。

于 2013-01-31T03:15:56.467 に答える
0

パッケージ名もサブルーチン名も実行時までわからないため、これを行っていると思います。Perl クックブックの古い版には、シンボリック参照を使用した次のレシピがあります。

{
    no strict 'refs';
    $val  = ${ $packname . "::" . $varname }; # Scalar
    @vals = @{ $packname . "::" . $aryname }; # Array
    &{ $packname . "::" . $funcname }("args"); # Function Call 1
    ($packname . "::" . $funcname) -> ("args"); # Function Call 2
}

この例では、課すno strict 'refs'シンボリック参照の制限を阻止するために行が使用されてuse strict;います (あなたがそれを使用していると仮定して...そしてそうすべきであると仮定します)。次に、スカラー、配列、および 2 つのサブルーチンにアクセスする例を示します。

于 2013-01-31T02:34:25.520 に答える