【问题标题】:Perl - Why am I getting "ERROR: Incorrect argument in parentheses"?Perl - 为什么我得到“错误:括号中的参数不正确”?
【发布时间】:2013-01-15 01:27:04
【问题描述】:

基本上,我正在尝试仅使用变量/标量调用包函数,但我不知道为什么会收到“错误:括号中的参数不正确”。

这里是示例下午:

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 的一种方法是使用 &{$mysub}($param);以及命名 sub $mysub = "foo::bar" 的字符串或引用 $mysub = \&foo::bar ;
  • 直到运行时才知道包或子程序的名称吗?
  • @JonahBishop - 是的,直到运行时我才知道包名称、子程序或参数
  • @Paul -arggh 抱歉,伙计 - 你先得到它。下次我来接你
  • 我猜,if 条件中缺少花括号。

标签: perl variables arguments package


【解决方案1】:

这个比较简单:

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

严格遵守。

【讨论】:

  • 然后你改变了一些东西。再试一次。 (我唯一改变的想法是我从错误命名的$package_sub_args 中删除了's'。)一定要使用use strict; use warnings;。你可能打错了。
  • 你是对的。我有一组额外的双冒号,所以这行得通 - 谢谢!
【解决方案2】:

我假设您这样做是因为在运行时之前您不知道包名称或子例程名称。 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; 强加的符号引用限制(假设您正在使用...并且您应该使用)。然后,显示了访问标量、数组和两个子例程的示例。

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多