我可以引用带有一些参数的命名子例程吗
Can I reference a named subroutine with some arguments
我有一个带多个参数的子例程,我想用其中一个参数集来引用它,这样引用就少了一个参数。最佳情况是
my $subref = \&routine($arg1);
...
my $result = $subref->($arg2,$arg3);
在 perlref 中有一个这样的匿名子例程的示例,但是我无法得到与命名子例程等效的工作。
下面是我的意思的完整示例。虽然 $func (引用匿名子)和 $func2 (引用命名子,但没有参数)工作。 $func3 给出错误 "Not a CODE reference[...]"。
我是不是漏掉了什么,或者这实际上是不可能的?
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, @_)};
}
\&args($arg)
是\( args($arg) )
,即对函数调用args($arg)
的return值的引用,不是对函数args
的引用] 使用参数 $arg
.
调用
print $func3; # SCALAR(0x8000a1a50)
要引用以 $arg
作为第一个参数执行 args
子例程的函数,请使用
sub new_arg {
my $arg = shift;
return sub { args($arg,@_) };
}
(看看那个,就像 Georg Mavridis 的回答一样)
我有一个带多个参数的子例程,我想用其中一个参数集来引用它,这样引用就少了一个参数。最佳情况是
my $subref = \&routine($arg1);
...
my $result = $subref->($arg2,$arg3);
在 perlref 中有一个这样的匿名子例程的示例,但是我无法得到与命名子例程等效的工作。
下面是我的意思的完整示例。虽然 $func (引用匿名子)和 $func2 (引用命名子,但没有参数)工作。 $func3 给出错误 "Not a CODE reference[...]"。
我是不是漏掉了什么,或者这实际上是不可能的?
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, @_)};
}
\&args($arg)
是\( args($arg) )
,即对函数调用args($arg)
的return值的引用,不是对函数args
的引用] 使用参数 $arg
.
print $func3; # SCALAR(0x8000a1a50)
要引用以 $arg
作为第一个参数执行 args
子例程的函数,请使用
sub new_arg {
my $arg = shift;
return sub { args($arg,@_) };
}
(看看那个,就像 Georg Mavridis 的回答一样)