是否有约定要求函数的必需参数列表?我希望能够调用一个子程序,告诉我在调用@repeat时需要提供$ phrase和$ times。
use strict;
use warnings;
sub repeat {
my $phrase = shift;
my $times = shift;
return $phrase x $times;
}
答案 0 :(得分:6)
当然,您可以根据自己的需要自行构建一些控制机制。但是有一些模块可以帮助您完成子程序签名。我会提供3个:
答案 1 :(得分:4)
您似乎要求内省。有很多OO框架提供它(例如Moose)。但是,如果您希望能够声明函数,然后在程序中对其进行检查,Function::Parameters是一种合理的方法。
来自Function::Parameters::Info摘要:
use Function::Parameters;
fun foo($x, $y, :$hello, :$world = undef) {}
my $info = Function::Parameters::info \&foo;
my $p0 = $info->invocant; # undef
my @p1 = $info->positional_required; # ('$x', '$y')
my @p2 = $info->positional_optional; # ()
my @p3 = $info->named_required; # ('$hello')
my @p4 = $info->named_optional; # ('$world')
my $p5 = $info->slurpy; # undef
my $min = $info->args_min; # 4
my $max = $info->args_max; # inf
my $invocant = Function::Parameters::info(method () { 42 })->invocant; # '$self'
my $slurpy = Function::Parameters::info(fun {})->slurpy; # '@_'
:: Info模块中的内省功能实际上是使用Moose实现的。
答案 2 :(得分:2)
在我看来,这个问题的最佳解决方案是使用Perl6::Parameters
,正如其名称所暗示的那样,模仿Perl 6 的语义,而不会使用源过滤器的恐惧。