基本上,我试图仅使用变量/标量来调用包函数,但我无法弄清楚为什么我会在“括号中出现错误:错误的参数”。
以下是示例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不需要参数时,我可以使它工作。但是我有几个需要参数的潜艇,这就是我磕磕绊绊......
答案 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);
严格使用。