Perl函数(子程序)学习笔记
Perl子程序以sub定义,命名可同变量但避免重名内置函数,用&前缀区分。原型说明指定参数类型,返回值默认最后执行语句,可用return显式返回。参数通过@_数组传递,为局部变量,修改$_[]会改变主程序参数。
先说几个核心概念。在 Perl 里,子程序本质上就是一段独立分离的代码,它的好处显而易见——减少重复代码,让程序更容易读。你可以在程序的任何地方定义子程序,但通常大家习惯放在开头或结尾,方便管理。
来看一个最基本的定义方式:
sub subroutine{
statements;
}
以 sub 开头,子程序名字的命名规则和变量一样。这里有个细节:子程序可以和变量同名,但最好不要和内置函数重名。如果真重名了,用 & 前缀来区分——不带 & 调用的是内置函数,带上 & 才是你定义的子程序。当然,省略 & 时容易混淆,所以建议养成用 & 的习惯(或者靠上下文明确区分)。
还有一种带原型说明的定义方式:
sub subroutine($$){ #需要两个简单变量的参数
statements;
}
原型说明的作用是提前告诉 Perl 这个子程序期望接收什么类型的参数。这里的符号规则:
$表示简单变量@表示列表%表示散列&表示匿名子程序*表示引用
每个字符对应一个参数。如果前面加上 \(原文中写的是“前加为强制类型一致”,此处应理解为反斜杠),则是强制类型一致。用分号 ; 可以分隔必须参数和可选参数。比如 @$;$ 表示第一个参数为列表,第二个为简单变量,第三个简单变量可选。
二、函数返回值
Perl 子程序的返回值机制挺随性的。默认情况下,子程序中最后执行的一个语句的值就是返回值。注意:如果最后执行的是某个 if 块里的语句,那这个块中的结果也会成为返回值(即便它不在子程序文本的最后一行)。
$a=1;
这里不用显式加 return,直接 $retval; 就可以返回。再比如:
split(/:/,@a) 返回数组.
如果你想主动控制返回什么,用 return(retval) 语句,它会立即退出子程序并返回 retval。这个返回值可以是标量,也可以是列表。
另外,返回错误的情况也很常见。直接 return 会返回 undef,表示失败。还有一种更优雅的方式:用 eval('subroutine') 包裹调用,这样错误信息会保存在特殊变量 $@ 中。
三、函数参数传递
参数传递的方式很直接。调用时写 $sub1($num1,$unm2,$num3);,然后在子程序里通过 @_ 数组接收所有参数:
$sub1($num1,$unm2,$num3); 调用
sub sub1{
my($num1,$unm2,$num3)=@_;
}
my $num1=shift;
my $num2=shift;
my $num3=pop;
这里有几个关键点需要记住:
- 所有传入的参数都放在数组
@_中,每个元素通过$_[0]、$_[1]访问。 @_和$_[ ]都是局部变量。如果子程序内部再调用另一个子程序,新的@_会重新生成,互不干扰。- 但要注意:如果你直接修改
$_[0]的值,它会改变主程序中对应参数的值(因为 Perl 默认是按引用传递的)。 shift和pop可以用来逐个取出参数。shift取第一个并删除,pop取最后一个并删除,操作的目标就是@_。



































