在Perl中可以自己创建子程序(Subroutine):
关键字sub,子程序名以及用花括号封闭起来的代码块。
sub marine { ... }
子程序名与标量的命名空间是不同的两个部分。
子程序的返回值:最后一次运算的表达式即是默认的返回值。也可以用return来显式的返回,这样之后的语句不会执行。
在标量上下文返回的会是标量,在列表上下文返回的也是列表。
子程序中的参数:子程序内部可以使用@_,$_[0],$_[1],$_[2],,,这样的变量来表示。@_变量是子程序私有变量,递归调用时,不会出错。
在子程序调用时,在子程序名后用括号括住的列表表达式。
$n = &max(10,15); #10后被送到$_[0],15被送到$_[1],@_=(10,15),在标量上下文值为2;
子程序私有变量定义: my关键字来声明词法变量(lexical variable)。 my($m,$n) = @_; #创建私有变量并赋值。
不仅可以定义在子程序中,还可以定义在if, while, foreach中。
只能用来声明单个标量/变量,列表/数组。 my $fred, $barney; #错误,第二个变量无法声明。
持久性私有变量: 用关键字state来声明,在子程序的多次调用中保留变量之前的值。作用域仍然是只存在于子程序内部。
sub marine {state $n=0; $n+=1; print; }
也可以用来声明数组和哈希类型。 state @number。
子程序的调用:子程序可以通过 (&+子程序名)的方式来调用。
如果编译器之前看到过子程序的定义,那么可以不加&,而直接调用子程序。
如果Perl可以通过语法规则直接判断它只能是子程序调用,那么也可以省略 &。
也就是说只要你将参数列表放进括号内,就一定是子程序调用。
use strict; #强制要求使用一些严格的,良好的编程风格。