Perl - 为什么我在括号中出现“错误:不正确的参数”?

时间:2013-01-31 02:21:23

标签: perl variables arguments package

基本上,我试图仅使用变量/标量来调用包函数,但我无法弄清楚为什么我会在“括号中出现错误:错误的参数”。

以下是示例pm:

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不需要参数时,我可以使它工作。但是我有几个需要参数的潜艇,这就是我磕磕绊绊......

2 个答案:

答案 0 :(得分: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;强加的符号引用限制(假设您正在使用它......您应该这样做)。然后,显示了访问标量,数组和两个子例程的示例。

答案 1 :(得分:0)

这更简单:

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

严格使用。