3.1 Perl--子程序

Perl可以让你创建子程序,它让我们可以重复利用已有的代码

例1:写一个求和的子程序,同时检验

#! /usr/bin/perl
use strict;                          #告诉perl内部的编译器的代码应该稍微严谨一些。也可以通过use                                           5.012隐式打开,
use warnings;
sub total{                            #要定义自己的子程序,可以通过sub,子程序名,花括号封闭起来
   my $sum=0;
   foreach (@_){
   $sum +=$_;
   }  
    $sum;
  }
my @fred =qw(1 2 5 7 9);   
my $fred_total=&total(@fred);          #通过&来调用子程序,如果不引起歧义,可以省略&。()里面是
print "The total of \@fred is $fred_total.\n";    参数 
print "Enter some numbers on seperate lines:";
my $user_total=total();
print "The total of those numbers is $user_total.\n";

所有的子程序都有一个返回值–子程序并没有“有返回值”或“没有返回值”之分。但并不是所有的在子程序的返回值都是有用的。最后一次结果都将自动当初子程序的返回值。在子程序里添加额外的程序代码时,请小心检查最后执行的表达式是哪一个,确定它是你要的返回值。 子程序自动将参数存在了@中,其中第一个参数为$[0],第二个为$_[1],一次类推,这些变量和$_没有任何关系。其中@_为子程序的私有变量。

perl里面所有的变量都都是全局变量,在程序的任何地方都可以访问他们。可以借助my来创建私有变量。这些变量属于子程序封闭语句块所有,其他地方使用不受影响。my $fred,$barney,只能申明第一个为私有变量。

return,子程序执行到一半的时候停止执行:

sub which_element_Is{
 my($what,@array)
     foreach (0..$#array)
   if ($what eq $array[$_]){
            return $_;
      }
     }
     -1;
   }

例2:找出大于平均值的数

#! /usr/bin/perl
use warnings;
use strict;
sub average{
   my $sum=0;
   my $n=0;
   my $average;
   foreach (@_){
   $sum +=$_;
   $n +=1;                  #也可以通过$n=@_来知道含有多少个元素。
   }  
   $average=$sum/$n;
   }
sub above_average{
     my @lists;              #定义私有变量
     my $a=&average(@_);     #调用上面的子程序
     foreach (@_) {    
     if ($_>$a){
      push @lists,$_;       #push往首先加元素
       } 
        }
      @lists;   
     }
my @fred=&above_average(1..10);
print "\@fred is @fred\n";

例3:记录之前都来了那些人

#! /usr/bin/perl
use warnings;
use strict;
use 5.010;
sub greet{
   state @names;
   my $name=shift;
   print"hi $name!";
   if (@names){
   print "I've seen:@names\n";
   }
   else{
   print "You are the first one here!\n";
   }
   push @names,$name;
   }
greet('fred');
greet('barney');
greet('wilma');

#通过state来记录之前调用后返回的只,左右下次调用的初始值,在多次调用后这个值被保存起来。这个特征是从perl 5.10开始的,所以得表明,刚开始没有加这个,老是在state报错

ps:

  1. 上面的方法尽管参考,方法肯定不止一个
  2. 如果跟我一样是菜鸟,请结合我的第一篇博客看如何运行这样的脚本。
  3. 博文内容为整理的《Perl语言入门》这本书,感谢这个书的作者Randal L等人的付出
个人公众号,比较懒,很少更新,可以在上面提问题:

更多精彩,请移步公众号阅读:

Sam avatar
About Sam
专注生物信息 专注转化医学