子程序
定义子程序
子程序的名字是Perl 中的另一个标识符(由数字,字符,下划线但不能由数字开头的串组成),有时由可选的符号(&)开头。
子程序的名字属于一个独立的名字空间,因此Perl 不会在你的子程序为&fred 同时也有一个变量为$fred 的情况下混淆,当然通常是没有理由这样命名的。
子程序的定义可以在程序的任意位置,但具有如C 或者Pascal 背景的程序员通常将它们放在程序的开头。某些其它的程序员可能将它们放在结尾,以使程序的主要部分在开头出现。不需要在定义之前有任何声明。子程序的定义是全局的;没有某些强大的技巧,Perl 中没有私有子程序(private subroutines)。如果两个子程序有相同的名字,那后一个将覆盖前一个。
调用子程序
可以使用子程序的名字(带有&)来调用子程序
子程序返回值
由于所有的被调用的子程序都要返回值,因此使用特殊的返回值语法在大多数情况下是一种浪费。因此Larry 将之简化了。当Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。
参数
$n = &max(10,15); #此子程序有2 个参数
sub max{
#和&larger_of_fred_or_barney 比较
If($_[0] > $_[1]){
$_[0];
}else{
$_[1];
}
}
@_
是子程序的一个私有变量;如果有一个全局变量@_
,它将在此子程序调用前存储起来,当子程序调用完成后,其早期的值会被重新赋还给@_
。这意味着当将参数传递给子程序时不用担心它会影响此程序中其它子程序的@_
这个变量的值。嵌套的子程序调用时,@_
的值和上述类似。甚至此子程序递归调用时,每一次调用将得到新的@_
,因此子程序调用时将得到其自身的参数列表。
sub max{
if(@_!=2){
print “WARNING! &max should get exactly two arguments!\n”;
}
#continue as before….
.
.
.
}
$maximum = &max(3,5,10,4,6);
sub max {
my($max_so_far) = shift @_;
foreach (@_){
if($_>$max_so_far){
$max_so_far=$_;
}
}
$max_so_far;
}
笔记的作用不是很明显,而且放慢了阅读的速度,先停写一段,或者说是换个模式,开始写更精的部分。
perl 学习笔记