perl获取所需参数的列表

时间:2015-02-18 19:25:38

标签: perl

是否有约定要求函数的必需参数列表?我希望能够调用一个子程序,告诉我在调用@repeat时需要提供$ phrase和$ times。

use strict;
use warnings;

sub repeat {
    my $phrase = shift;
    my $times = shift;
    return $phrase x $times;
    }

3 个答案:

答案 0 :(得分:6)

当然,您可以根据自己的需要自行构建一些控制机制。但是有一些模块可以帮助您完成子程序签名。我会提供3个:

  1. signatures,最简单的
  2. Kavorka,带有类型检查
  3. 对于OO方法,
  4. Method::Signatures

答案 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 的语义,而不会使用源过滤器的恐惧。