Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-为什么我会得到;错误:括号中的参数不正确";?_Perl_Variables_Arguments_Package - Fatal编程技术网

Perl-为什么我会得到;错误:括号中的参数不正确";?

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

基本上,我试图只使用变量/标量调用包函数,但我不明白为什么会出现“错误:括号中的参数不正确”

以下是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不需要参数时,我可以让它工作。但是我有几个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')确保使用
严格使用;使用警告。你可能打错了,你是对的。我有一个额外的双冒号集,所以这个工作-谢谢!