名字
perlsub - Perl 子程序
概要
子程序申明:
sub NAME; # 前置申明
sub NAME(PROTO); # 同上, 带有原型
sub NAME : ATTRS; # 带属性
sub NAME(PROTO) : ATTRS; # 带属性和原型
sub NAME BLOCK # 声明和定义
sub NAME(PROTO) BLOCK # 同上带有原型
sub NAME : ATTRS BLOCK # 带属性
sub NAME(PROTO) : ATTRS BLOCK # 带属性和原型
在运行时定义匿名子程序:
$subref = sub BLOCK; # 不带原型
$subref = sub (PROTO) BLOCK; # 带原型
$subref = sub : ATTRS BLOCK; # 带属性
$subref = sub (PROTO) : ATTRS BLOCK; # 带原型和属性
导出子程序:
use MODULE qw(NAME1 NAME2 NAME3);
调用子程序:
NAME(LIST); # 带括弧时&是可省略的
NAME LIST; # 若子程序预定义或者导出过,括弧可以省略
&NAME(LIST); # 带有原型
&NAME; # 用当前的@_做子程序的参数
说明
和很多语言一样,perl提供用户定义的子程序。子程序可能放在主程序中的任意
位置,或者通过"do", "require"或"use"关键字其它文件装载进来,或者在运行时
用"eval"或者匿名子程序生成的。你甚至能通过一个包含例程名字或者代码引用的
变量间接调用一个函数。
perl函数模型调用和返回的值是简单的:所有的函数通过一个标量列表传递参数,
同样地所有的函数返回一个标量列表到调用者。数组或哈希表在这些调用和返回列
表中将被破坏,丢掉他们的标识符。不过你可以用传递引用来避免这种情况。调用
和返回的列表可以包含你想要的标量。(通常一个没有明确返回状态的函数被称为
子程序,从perl的观点来看,这2者没有区别)
所有被传递的参数被放进@_中。因此,如果你调用一个带2个参数的函数,参数将被
存储在$_[0] 和$_[1]中。数组@_是一个局部变量,数组中的元素是那些实际标量的别名。
特别的,如果$_[0]被更新,对应的参数也将被更新(若不能更新将出错)。如果一个参数
在函数调用时,是一个不存在的数组或者哈希元素,这个元素将被创建仅当它被修改或
者是一个引用。(不管元素是否赋值,perl的一些早期版本创建该元素。)应该将@_赋值给
其他变量,移除那些别名,不要修改任何参数。
"return"状态可以用来退出一个子程序,随意指定返回值,返回值将被转换在一个
合适的环境(列表,标量或者空),这取决于子程序的调用环境。如果你不指定返回值,
子程序在列表环境下会返回一个空列表,在标量环境下会返回一个未定义的值,或者在
空环境下什么也不返回。如果你返回一个或更多的集合物(数组和哈希表),它们将被放进
一个大的列表中,难于区分。
如果没有"return",且最后的语句是一个表达式,那么它的值将被返回。如果最后的
语句是一个像"foreach"或者"while"循环控制结构,返回值将是未指定的。空子程序返
回空列表。
perl没有正式的命名参数。通常你应该把它们赋值给一个"my()"列表。那些没有
申明为私有的变量是全局变量。更多关于创建私有变量的细节,在"Private Variables
via my()"和"Temporary Values vialocal()".为在一个单独的包(可能一个单独的文件)
中的一组函数创建可保护环境,看perlmod中的"Packages"。
例子:
sub max {
my $max = shift(@_);
foreach $foo (@_) {
$max = $foo if $max < $foo;
}
return $max;
}
$bestday = max($mon,$tue,$wed,$thu,$fri);
例子:
# get a line, combining continuation lines
# that start with whitespace
sub get_line {
$thisline = $lookahead; # global variables!
LINE: while (defined($lookahead = )) {
if ($lookahead =~ /^[ \t]/) {
$thisline .= $lookahead;
}
else {
last LINE;
}
}
return $thisline;
}
$lookahead = ; # get first line
while (defined($line = get_line())) {
...
}
赋值给一列私有变量来命名函数的参数:
sub maybeset {
my($key, $value) = @_;
$Foo{$key} = $value unless $Foo{$key};
}
通过参数将参数值赋值的备份,这将使引用的调用转化为值的调用。否则函数将自由
修改@_中元素导致调用者值改变。
upcase_in($v1, $v2); # this changes $v1 and $v2
sub upcase_in {
for (@_) { tr/a-z/A-Z/ }
}
阅读(1629) | 评论(0) | 转发(0) |