1 子程序
1.1 定义子程序
使用关键字sub开头,在写上子程序名(字母、数字和下划线组成,不能以数字开头),大括号框柱子程序主体。子程序可以定义在文件的任意位置,为了方便代码阅读,一般建议放在开头或结尾处。
sub marine{
$n += 1; #全局变量
print"Hello,sailor number $n!\n";
}
1.2 调用子程序
在任意表达式中,子程序名前加与号(&),表示调用这个子程序。
&marine; #调用前面的子函数
1.3 返回值
子程序在被调用时一定是作为表达式的一部分,并且在perl中所有的子程序都有返回值,larry将子程序执行的最后一次运算的结果,自动作为返回值。
sub sum_add{
print"The value is:";
$num1 + $num2; #此结果为返回值
# print“($num1 + $num2)”; 此表达式做最后一次运算结果返回值为1,只会判断是否有输出信息
}
#对返回值需要小心确认
1.4 参数
perl支持参数传递,在子程序调用的后面加上括号,并括号内写入列表表达式,比如:
$s = &max(10,17);
1.5 子程序中的私有变量
可以通过my操作符来创建私有变量,私有变量的作用域仅仅局限于封闭语句块中,语句块内的私有变量与外部变量互相不影响。my操作符声明的词法变量可以用在任意语句块中,仅作用于当前语句块。
sub max{
my($m,$n); #新建私有变量
($m,$n) = @_; #参数赋值给变量
if($m>$n) {$m}
else{$n}
}
1.6 use strict 编译指令
编译指令,是提供给编译器的某些指示,编译器将遵循你的指示处理接下来的代码。use strict是启用相对严格的编码风格的指令。
建议使用在程序较长的情况下。
1.7 return操作符
return操作符将会终止子程序运行,并返回某个值。
1.8 非标量返回值
子程序的返回值不仅可以返回标量值,也可以返回列表值。
sub ilst{
if($num1<$num2){
$num1..$num2;
}
else{
reverse $num2..$num1;
}
}
$num1,num2;
@c = &list; # 此处返回列表值
1.9 持久化私有变量
对于多次调用同一子程序的情况,子程序的私有变量,每次都会被初始化。若要保持子程序中的私有变量的值,需要使用state操作符,使私有变量在子程序中保留,不被初始化。
use v5.10; #在5.10版本被引入
sum1(5,6);
sum2(1..3);
sum3(4);
sub sum_run{
state $sum = 0; # 定义当前子程序的私有变量,并保留该变量的值
state @numbers;
foreach my $number(@_){
push @numbers,$number;
$sum += $number;
}
}