perl - 我可以引用带有一些参数的命名子例程吗

标签 perl reference arguments subroutine

我有一个带有多个参数的子例程,并希望使用其中一个参数集来引用它,这样引用就少了一个参数。最佳情况是

my $subref = \&routine($arg1);
...
my $result = $subref->($arg2,$arg3);

perlref有一个像这样的匿名子程序的例子,但是我不能得到一个命名的子程序的等价物。

下面是我的意思的完整示例。虽然 $func (引用匿名子)和 $func2 (引用命名子,但没有参数)工作。 $func3 给出错误“不是代码引用[...]”。

我错过了什么还是这实际上是不可能的?

use strict;
use warnings;

sub args{
    my $arg1 = (shift or "none");
    my $arg2 = (shift or "none");
    my $arg3 = (shift or "none");
    my (undef, undef, undef, $function) = caller(0);
    return "me: $function\narg1 = $arg1\narg2 = $arg2\narg3 = $arg3\n";
}

sub just_a_ref {
    return \&args;
}

sub new_arg_anon {
    my $arg = shift;
    return sub{
        my $arg1 = $arg;
        my $arg2 = (shift or "none");
        my $arg3 = (shift or "none");
        my (undef, undef, undef, $function) = caller(0);
        return "me: $function\narg1 = $arg1\narg2 = $arg2\narg3 = $arg3\n";
    }
}

sub new_arg {
    my $arg = shift;
    return \&args($arg);
}


my $func = new_arg_anon("one");
print $func->("two","three");     #works fine
my $func2 = just_a_ref();
print $func2->("un", "deux", "trois");  #works fine
my $func3 = new_arg("eins");
print $func3->("zwei", "drei");   #Not a CODE reference


最佳答案

您必须创建一个新的匿名函数来执行此操作。使用一个参数集调用目标函数并将其余参数传递给它。在您的示例中,new_arg 函数应该是:

sub new_arg {
    my $arg = shift;
    return sub {args($arg, @_)};
}

关于perl - 我可以引用带有一些参数的命名子例程吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61235615/

相关文章:

perl - 在 perl 5.6 之后 Symbol::gensym 是否仍然有用?

Perl PDL : Search if a vector is in an array or in a matrix

Python - 如何检查/发现列表有引用?

c++ - 为什么我不需要检查引用是否无效/空?

perl - 如何禁用 perl 的垃圾收集器?

linux - 如何在同一文件中添加行数

python - 了解 Odoo 中的 "takes at least X arguments (X given)"错误

python - 回调函数不可调用

c# - 如何从动态生成的程序集中引用 GAC 程序集?

ruby - 为什么respond_to?在 Ruby 中需要符号作为参数吗?