Perl中的方法是否有签名?

时间:2013-08-22 20:55:59

标签: perl

我想澄清我对以下内容的理解 假设我有一个Perl模块,其功能需要3个参数 例如。在功能中:
my ($a, $b, $c) = @_;

现在这个函数被2个不同的其他脚本调用 其中一个脚本需要一些“附加”功能。如果我通过一些例如功能的2个额外参数,例如
my ($a, $b, $c, $d, $e) = @_;如果定义它们就使用它们,这不会造成任何问题吗? 我主要担心的是,perl中没有函数签名或类似的东西吗?所以我可以传递任何参数

3 个答案:

答案 0 :(得分:3)

您可以根据需要传递任意数量的参数。你没有分配的所有那些都不会被使用。在您使用的作业表单中,它们将保留在@_

sub foo {
  my ($a, $b, $c) = @_;
}

foo(1, 2, 3, 4);

在这种情况下,永远不会将4分配给变量,但它仍然存在。

如果您将其称为foo(1, 2)并且不会造成任何伤害,除非您使用$c执行某项操作。

但是,对于具有一定数量参数的foo,您不能为具有相同名称的两个不同的子定义两种不同的行为。你需要在一个子中自己构建它。但是,它并不总是有意义的。

sub foo {
  my ($x, $y, $z) = @_;
  if ($z) {
    return $x + $y + $z;
  else {
    return $x - $y;
  }
}

答案 1 :(得分:3)

在Perl中,每个sub都会获取一个标量列表,并返回一个标量列表。用C-ish术语来说,这可以写成

SV** some_sub(SV** args);

其中SV*是标量变量的类型。

有一些方法可以限制参数:例如使用Method::Signatures的语法糖或原型(不使用原型)。

无论数组my ($a, $b, $c, $d, $e) = @_;的大小如何,列表分配@_都有效。如果RHS(右侧)的LHS元素较少,则左侧的标量为undef。 E.g。

sub foo {
  my ($x, $y, $z) = @_;
  say "x is ", $x // "undef";
  say "y is ", $y // "undef";
  say "z is ", $z // "undef";
}

say "foo(1)";
foo(1);
say "foo(1, 2, 3)";
foo(1, 2, 3);
say "foo(1 .. 10_000)";
foo(1 .. 10_000);  # ten thousand arguments!

输出:

foo(1)
x is 1
y is undef
z is undef
foo(1, 2, 3)
x is 1
y is 2
z is 3
foo(1 .. 10_000)
x is 1
y is 2
z is 3

答案 2 :(得分:3)