子程序,类比c语言中的函数,在形式上个人认为最大的区别:没有形参
#! /usr/bin/perl
sub marine { $n += 1 ; print "$n\n" ; } &marine; &marine; |
所有的Perl 子程序都会返回值,在Perl 中返回值和不返回值是没有区别的。当然,不是所有Perl子程序返回的值都是有用的。
由于所有的被调用的子程序都要返回值,因此使用特殊的返回值语法在大多数情况下是一种浪费。因此Larry将之简化了。当Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。
#! /usr/bin/perl
$num1 = 10 ; $num2 = 20 ; sub marine { $n += 1 ; print "$n\n" ; $num1 + $num2 ; } &marine; &marine; print 1 + &marine,"\n" ; |
所有的函数都会有返回值:
print 语句,其返回值通常为1,意思是“print was succfessful(打印成功)”
直接调用return情况也是有的
#! /usr/bin/perl use strict ;
my @names = qw /fred barney betty dinoWilma pebbles bam-bamm/; my $result = &which_element_is("dino", @names); print $result ,"\n";
my $result = &which_element_is("betty", @names); print $result ,"\n"; # sub which_element_is { my($what, @array) = @_; foreach(0..$#array){ #@array元素的索引 if($what eq $array[$_]){ return $_; #找到既返回 } } -1; #没有找到元素(此处是可选的) } |
Perl 子程序将参数列表传给子程序中的方法是,在程序名后面接括号,括号内存放参数列表,如:$n = &max(10,15); #此子程序有2个参数
此参数列表被传到子程序中,这些参数可以被子程序使用。当然,这些参存放在某个地方,在Perl中,会自动将此参数列表(此参数列表的另一个名字)自动存放在一个叫做@_的数组中。子程序可以访问次数组变量来确定此参数的个数以及其值,子程序参数的第一个值存放在$_[0]中,第二个存放在$_[1],依次类推。
Perl 不会关心是否有多余的变量。参数不够时也会被忽略,当传入的参数个数不够时,不够的参数会得到undef这个值。
@_是子程序的一个私有变量,如果有一个全局变量@_,它将在此子程序调用前存储起来,当子程序调用完成后,其早期的值会被重新赋还给@_。这意味着当将参数传递给子程序时不用担心它会影响此程序中其它子程序的@_这个变量的值。
嵌套的子程序调用时,@_的值和上述类似。甚至此子程序递归调用时,每一次调用将得到新的@_,因此子程序调用时将得到其自身的参数列表。
注意:
调用的子程序没有参数时,此时@_从此调用者的上下文(context)得到。这通常不是个好主意,但有时很有用。
在调用子程序时,参数会在子程序中被修改。
#! /usr/bin/perl
$num1 = 10 ; $num2 = 20 ; sub marine { $n += 1 ; print "$n\n" ; $num1 + $num2 ; $_[0] += 20 ; } &marine; &marine; print 1 + &marine,"\n" ;
$arg = 10 ; &marine($arg) ; print $arg ,"\n"; |
更高级的max,可以不用限制参数个数
$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; } |
使用my创建私有变量:
sub max {
my($m,$n) = @_; #局部变量赋值
if($m > $n) {$m} else{$n}
}
上面的一条语句创建了一些私有变量并给它们赋值,第一个为$m,第二个为$n。几乎每一个子程序都由类似的语句开头。当看见那一行时,你就知道此子程序需要2个变量,在此子程序中分别被叫做$m和$n。
在程序顶端use strict(或者在任意块或者文件中,如果你需要在此部分使用它),Perl进行更严格的语法检测。
许多人推荐如果程序长度大于一个屏幕,则需要使用use strict