Perl-为什么我会得到;错误:括号中的参数不正确";?
基本上,我试图只使用变量/标量调用包函数,但我不明白为什么会出现“错误:括号中的参数不正确” 以下是pm示例:Perl-为什么我会得到;错误:括号中的参数不正确";?,perl,variables,arguments,package,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
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不需要参数时,我可以让它工作。但是我有几个sub确实需要参数,这就是我遇到的问题…我假设您这样做是因为在运行时之前您不知道包名或子例程名。较旧版本的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”
行用于阻止使用strict的符号引用限制代码>强制(假设您正在使用它…并且您应该使用它)。然后,显示了访问标量、数组和两个子例程的示例。这更简单:
my $package_sub_ref = \&{ $package . '::' . $package_sub };
my $response = $package_sub_ref->($package_sub_arg);
与strict一起工作。我相信间接调用sub的一种方法是使用&{$mysub}($param);以及命名子$mysub=“foo::bar”的字符串或引用$mysub=\&foo::bar;直到运行时你才知道包或子例程的名称吗?@jonahbshop-是的,直到运行时我才知道包名、子例程或参数runtime@Paul-啊,对不起,伙计-你先吃的。下次我会给你打电话的,我想,你在if
条件下缺少一个花括号。然后你改变了一些东西。再试一次。(我唯一改变的想法是,我从命名错误的$package\u sub_args
中删除了's')确保使用严格使用;使用警告代码>。你可能打错了,你是对的。我有一个额外的双冒号集,所以这个工作-谢谢!