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";

##格式

定义子程序的格式为

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值