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