Perl子程序
1. 子程序的基本属性
1.1 子程序的定义
- 要定义子程序,首先要以关键字 sub 开头,再加上子程序名,花括号,花括号中包含的是函数的主体。
- 子程序可以被定义在程序的任意位置;不需要对子程序进行事先声明;
- 子程序是全局的,如果定义了两个重名的子程序,后面的子程序会覆盖前面的那个;
#a simple subroutine
sub marine{
$n += 1;
print "$n time call marine subroutine.\n";
}
1.2 子程序的调用和返回值
- 子程序调用:在任意表达式中,子程序前面的 & 表示调用这个子程序;如 &marine
- 子程序返回值(标量):
- Perl中子程序没有 “有无返回值” 的区别;
- 任何时候子程序都有返回值,但有时这个值并没有什么用处,每次都写返回值return就显得十分麻烦;
- Perl将子程序执行的最后一次运算的 “结果” ,结果不一定是数值计算得到,当做返回值;
- 子程序返回值 (非标量):
- 如果在子程序最后一句调用列表上下文,可以返回列表值;
#non-scalar return value
sub list_from_fred_to_barney{
if ($fred < $barney) {
$fred..$barney;
} else {
reverse $fred..$barney;
}
}
$fred = 11;
$barney = 6;
@c = &list_from_fred_to_barney; #@c is (11 10 9 8 7 6) now
注意1.1中例:marine子程序执行的最后一次运算是print,它的返回值通常是 1,表示成功输出信息,但显然这不是我们想要的值,所以一定要注意子程序中最后执行的语句。
1.3 子程序的参数
- Perl支持参数传入,要传递参数列表到子程序里,只要在子程序调用的后面加上括号内的列表表达式即可;
- 列表传入子程序后,子程序自动将参数存入 @_,该变量在子程序执行期间有效,子程序通过访问这个数组,以判断参数的个数和参数值;
- 传入的参数 > 子程序需要,后面的参数将被忽略;
- 传入的参数 < 子程序需要,缺少的参数值被定为undef;
#列表传入,max比较传入的两个参数,返回值较大的那个
sub