Perl子程序

在某些语言中,子程序(subroutine)是没有返回值的可复用的代码结构,函数(function)是有返回值的可复用的代码结构。

在Perl中,子程序就是函数,它们没有区别。但通常,会将内置的代码结构称为函数,将自定义的代码结构称为子程序。

Perl内置了很多已经预先定义好的函数,例如rand()、chomp()等,这些函数称为内置函数,可直接调用这些函数。

Perl也允许使用sub关键字自定义子程序。例如:

# 定义子程序
sub say_hello{
  say "hello";
}

# 调用子程序
say_hello();

定义子程序完整的语法为:

sub NAME BLOCK
sub NAME(PROTO) BLOCK
sub NAME : ATTRS BLOCK
sub NAME(PROTO) : ATTRS BLOCK

对于这几种定义语法:

  • 通常情况下定义子程序时,子程序名称后面不带括号,正如前面定义的say_hello子程序
  • 如果定义子程序时,子程序名称后面加上小括号,表示定义原型子程序。原型子程序是一种参数模板,可粗略地理解为函数签名,比如限制最多传递几个参数、限制传递数组还是hash,等等。多数原型功能也能通过普通子程序实现,并且原型的效果有时候是超出预料的,因此,除非明确知道所使用的原型含义,否则不推荐定义原型子程序
  • 定义子程序时使用了冒号,这表示为子程序设置它的属性,可用的三种属性是:
    • locked:表示锁住子程序,使其线程安全,多个线程无法同时进入子程序
    • method:表示这个子程序是对象方法,method通常结合locked一起使用,此时表示锁住方法的第一个参数(self),即锁住对象
    • lvalue:表示这个子程序可以作为一个左值,即可以被赋值

更多子程序属性(以及变量属性),参考perldoc attributes