##格式
定义子程序的格式为
sub 子程序名{
表达式;
}
注意:
- 子程序的定义是全局的
- 如果定义的两个子程序是重名的,后面的子程序会覆盖先前的
##调用子程序
可以在表达式中使用子程序名来调用
$marine; #打印 Hello!
sub marine{
print "Hello!\n";
}
在子程序的调用时,会看到有 marine
和 &marine
两种方式,区别在于:
-
marine
调用,子程序要出现在被调用出之前,这点类似于C语言,调用子函数时,子函数需要在调用处之前先声明 -
&marine
调用,与之相反
##返回值和return
在Perl中,一般默认返回最后一次运算的结果,例如:
1 use 5.010;
2
3 my $a = 1;
4 my $b = 2;
5 my $c = 3;
6
7 sub sum{
8 $a + $b;
9 $a + $c; #返回值
10 }
11
12 my $sum_all = sum;
13
14 print "The sum is $sum_all \n";
##格式
定义子程序的格式为
sub 子程序名{
表达式;
}
注意:
- 子程序的定义是全局的
- 如果定义的两个子程序是重名的,后面的子程序会覆盖先前的
##调用子程序
可以在表达式中使用子程序名来调用
$marine; #打印 Hello!
sub marine{
print "Hello!\n";
}
在子程序的调用时,会看到有 marine
和 &marine
两种方式,区别在于:
-
marine
调用,子程序要出现在被调用出之前,这点类似于C语言,调用子函数时,子函数需要在调用处之前先声明 -
&marine
调用,与之相反
##返回值和return
在Perl中,一般默认返回最后一次运算的结果,例如:
1 use 5.010;
2
3 my $a = 1;
4 my $b = 2;
5 my $c = 3;
6
7 sub sum{
8 $a + $b;
9 $a + $c; #返回值
10 }
11
12 my $sum_all = sum;
13
14 print "The sum is $sum_all \n";
如果我们想在子程序执行一半时就返回,可以用 return
1 use 5.010;
2
3 my $a = 1;
4 my $b = 2;
5 my $c = 3;
6
7 sub sum{
8 if($b > $a){
9 return $a + $b;
10
11 }
12 else{
13 $a + $c;
14 }
15 }
16
17 my $sum_all = sum;
18
19 print "The sum is $sum_all \n";
执行结果为:
##参数
给定一个取两数最大值的子程序:
1 sub larger{
2 if($a > $b){
3 $a;
4 }
5 else{
6 $b;
7 }
8 }
如果想比较任意的两个数,可以这样调用子程序
1 use 5.010;
2
3 my $max = &larger(10, 15);
4 my $max = &larger(4, 1);
在Perl中,有一个特殊的数组变量@
,Perl会自动将参数列表化名为@_
变量@_
在子程序执行期间有效,并且这个变量是子程序私有的
如果已经有了全局变量@_
,则在子程序调用前会先被存起来,并在子程序返回时恢复原来的值
由于这个特殊的变量,子程序的第一个参数会存储于$_[0]
,第二个参数存储于$_[1]
,以此类推
那么上边的子程序可以改写为:
1 sub larger{
2 if ($_[0] > $_[1]){
3 $_[0];
4 }
5 else{
6 $_[1];
7 }
8 }
可以看出,这个子程序只接受两个参数,当出现更多的参数时,就会被忽略
可能有人会想,在子程序中多加几个 if...else
语句就行了,但如果要比较的参数有数十上百个,甚至要比较的参数的个数都是未知的呢
因此需要利用其他方法
1 sub larger{
2 my $max_sofar = shift;
3 foreach (@_){
4 if($max_sofar < $_){
5 $max_sofar = $_;
6 }
7 }
8
9 $max_sofar;
10 }
my $max_sofar = shift;
将数组的第一个值传递给 &max_sofar
, 同时认为第一个参数是当前的最大值
随后利用循环语句 foreach
遍历数组中的每个元素,依次做比较,如果有数值大于 $max_sofar
则将该数传递给 $max_sofar
, 直到遍历完所有的元素