我想澄清我对以下内容的理解
假设我有一个Perl模块,其功能需要3个参数
例如。在功能中:
my ($a, $b, $c) = @_;
现在这个函数被2个不同的其他脚本调用
其中一个脚本需要一些“附加”功能。如果我通过一些例如功能的2个额外参数,例如
my ($a, $b, $c, $d, $e) = @_;
如果定义它们就使用它们,这不会造成任何问题吗?
我主要担心的是,perl中没有函数签名或类似的东西吗?所以我可以传递任何参数
答案 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)
仅回答问题的主题部分,这是为了来自搜索引擎的人的利益:
Signatures are available in standard Perl from version 20. CPAN模块提供更多功能:
我推荐 Kavorka 。