2

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

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

4

3 回答 3

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;
  }
}
于 2013-08-22T21:02:54.997 回答
3

在 Perl 中,每个 sub 接受一个标量列表,并返回一个标量列表。用 C-ish 术语,这可以写成

SV** some_sub(SV** args);

SV*标量变量的类型在哪里。

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

my ($a, $b, $c, $d, $e) = @_;无论数组的大小如何,列表赋值都有效@_。如果 RHS(右手边)的元素比 LHS 少,那么左边的标量是undef。例如

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
于 2013-08-22T21:04:11.040 回答