Perl子例程参数
我最近一直在阅读关于Perl,并对Perl处理传递给子程序的参数有点困惑。
在像Python,Java或PHP这样的语言中,函数定义采用的形式(在伪代码中): function myFunc(arg1,arg2) { // Do something with arg1 and arg2 here } 然而在Perl它只是: sub mySub { # @_ holds all arguments passed } 根据我的理解,这是唯一的方法。 >如果我想限制调用者只传递2个参数怎么办? sub a_sub { if (@_ == 2) { # Continue function } else { return false } } 解决方法
你对Perl环境很警惕,因为它与你之前遇到的语言截然不同。
相信强类型和功能原型的人在这里将不同意,但我认为这样的限制很少有用。有C真的抓住你传递错误的参数数量到一个函数经常足够有用吗? 在现代Perl中最常见的是将@_的内容复制到词法标量变量列表中,因此您通常会看到以 sub mysub { my ($p1,$p2) = @_; ... etc. } 这样,传递的所有参数都将作为@_($ _ [0],$ _ [1]等等)的元素可用,而期望的参数被命名并出现在$ p1和$ p2中(尽管我希望你理解这些名称应适当选择)。 在子程序是方法的特定情况下,第一个参数是特殊的。在其他语言中,它是self或这是,但在Perl它只是@_中的第一个参数,你可以称它为你喜欢的。在这种情况下你会看到 sub method { my $self = shift; my ($p1,$p2) = @_; ... etc. } 因此上下文对象(或类的名称,如果它是一个类方法)被提取到$ self(一个习惯假设的名称),其余的参数保留在@_中被直接访问,或者更通常,复制到局部标量变量$ p1,$ p2等。 大多数情况下,投诉是没有类型检查,所以我可以传递任何标量我喜欢作为子程序参数。只要在上下文中使用strict和use warnings,即使这通常很容易调试,只是因为子程序可以对一种形式的标量执行的操作在另一种形式上通常是非法的。 虽然它最初是关于面向对象的Perl的封装,这个引用Larry Wall是非常相关的
C在设计和实现的时候,它是一个主要的效率提高,如果你可以得到一个错误的程序在编译期间失败,而不是在运行时。这已经改变了现在,虽然类似的情况已经出现在客户端JavaScript,它实际上是有用的知道代码是错误的,从互联网获取它必须处理的数据。可悲的是,JavaScript参数检查现在比它应该是更宽松。 更新 对于那些怀疑Perl用于教学目的的人来说,我建议这是因为Perl的机制是如此简单和直接,他们是理想的这样的目的。 >当调用Perl子例程时,调用中的所有参数都在@_中别名。您可以直接使用它们来影响实际参数,或者复制它们以防止外部操作>如果调用Perl子例程作为方法,那么将调用对象或类作为第一个参数。再次,子例程(方法)可以做它喜欢用@_ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |