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 符号类型中使用变量,必须使用 -> 符号。

无论如何,非常感谢帮助。

澄清 - 我遇到的问题是直到运行时才知道包、子或参数。当子不需要参数时,我可以使它工作。但是我有几个确实需要参数的潜艇,这就是我绊倒的地方......

4

2 回答 2

0

我假设您这样做是因为在运行时之前您不知道包名称或子例程名称。Perl Cookbook 的旧版本有这个使用符号引用的配方:

{
    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;(假设您正在使用它......并且您应该使用它)。然后,显示了访问标量、数组和两个子例程的示例。

于 2013-01-31T02:34:25.520 回答
0

这更简单:

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

工作严格。

于 2013-01-31T03:15:56.467 回答