Perl学习笔记--子程序

格式

定义子程序的格式为

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, 直到遍历完所有的元素

你可能感兴趣的:(Perl学习笔记--子程序)