您对 Perl 环境持谨慎态度,因为它与您之前遇到的语言完全不同。
相信强类型和函数原型的人在这里会不同意,但我相信这样的限制很少有用。C真的让你经常向函数传递错误数量的参数以至于有用吗?
在现代 Perl 中最常见的是将 的内容复制@_
到词汇标量变量列表中,因此您经常会看到以
sub mysub {
my ($p1, $p2) = @_;
... etc.
}
这样,所有传递的参数都将作为@_
(等) 的元素使用,而$_[0]
预期的参数被命名并出现在and中(尽管我希望您理解应该适当地选择这些名称)。$_[1]
$p1
$p2
在子例程是方法的特殊情况下,第一个参数是特殊的。在其他语言中它是self
or this
,但在 Perl 中它只是 in 的第一个参数@_
,您可以随意称呼它。在那种情况下,你会看到
sub method {
my $self = shift;
my ($p1, $p2) = @_;
... etc.
}
以便上下文对象(或类的名称,如果它是类方法)被提取到$self
(约定的名称)中,其余参数保留在@_
其中以便直接访问,或者更常见的是复制到本地标量变量为$p1
等$p2
。
最常见的抱怨是也没有类型检查,所以我可以将我喜欢的任何标量作为子例程参数传递。只要use strict
和use warnings
在上下文中,即使这通常也很容易调试,因为子例程可以在一种形式的标量上执行的操作通常在另一种形式上是非法的。
虽然它最初更多是与面向对象的 Perl 的封装有关,但 Larry Wall 的这句话是非常相关的
Perl 并不热衷于强制隐私。它宁愿你呆在它的客厅外面,因为你没有被邀请,而不是因为它有猎枪
如果您可以在编译期间而不是在运行时让错误的程序失败,那么C 的设计和实现是在它是一个主要的效率提升的时代。现在情况发生了变化,尽管客户端 JavaScript 也出现了类似的情况,在从 Internet 获取它必须处理的数据之前知道代码错误实际上是有用的。可悲的是,JavaScript 参数检查现在比应有的宽松。
更新
对于那些怀疑 Perl 用于教学目的的人,我建议正是因为Perl 的机制是如此简单和直接,所以它们非常适合这种目的。