子程序

-1-----------------------------------------------------------------------------------------------------
   子程序的定义:
      子程序是sub,子程序名(不包含与号)以及花括号封闭起来的代码块,这部分代码就是子程序的主体。

      sub sname
      {
         $n +=1; #全局变量$n
         print "Hello,sailor number $n\n";
      }

   子程序的调用:

      &sname; #print Hello, sailor number 1;
      &sname; #print Hello, sailor number 2;
      &sname; #print Hello, sailor number 3;


-1-----------------------------------------------------------------------------------------------------

-2-----------------------------------------------------------------------------------------------------
 返回值
    在Perl中,所有的子程序都有一个返回值——————子程序并没有"返回值""没有返回值"之分,但并不是所有的子
    程序都包含有用的返回值。

    在返回值perl简化了操作可以不用写return关键字,在子程序运行过程中,它会不断进行运算,而最后一次运行
    的结果(不管是什么)都会被自动当成子程序的返回值。

    sub sum_of_fred_and_barney
    {
       print "Hey,You called the sum_of_fred_and barney subroutine!\n";
       $fred+ $barney;   #这是就返回值
    }

    $fred =3;
    $barney =4;


    sub remax
    {
       my $m=shift; #读取第一个参数
       my @array=@_; #读取所有的参数
       my $max;      #初始变量,用来存储最大数值
       foreach (@array)  #遍历数组
       {
          if ($m < $_)  #如果每循环一次$m小于数组中的某个元素,那会最大数存储于$max变量,否则$max=$m;
          {
             $max=$_;
          }
          else
          {
            $max=$m;
          }

        }
          return $max;  #返回最大数
    }

    my $max = &remax(1,2,3,4,23,3,2,100);
    print "$max\n"; #result is 100;
-2-----------------------------------------------------------------------------------------------------

-3-----------------------------------------------------------------------------------------------------
  子程序中的私有变量
     默认情况下,perl里面所有的变量都是全局变量,也就是说,在程序里的任何地方都可以访问他们。但你也借助
     my操作符来创建私有变量,我们称之为词法变量(lexical vairable)
     sub mamx
     {
        my ($a,$b);
        my $max;
        if($a < $b)
        {
           $max=$b;
        }
        else
        {
           $max=$a;
        }
        return $max;
     }
-3-----------------------------------------------------------------------------------------------------


-4-----------------------------------------------------------------------------------------------------
  变长参数列表
     在真实的代码中,经常会把任意长度的列表作为参数传给子程序。(感觉不够严谨)。一些传统的程序语言,它们
     习惯强类型(scrictly typed)子程序,也就是只允许一定个数的参数并且预先限定他们的类型。

     perl通过检查@_数组的长度其实也很容易确定参数的个数是否正确。

     sub max 
     {
        if (@_ != 2)
        {
             print "WARNING! &max shoubld be get exactly two argruments!\n";
        }
        else
        {
            .....
        }
     }

-4-----------------------------------------------------------------------------------------------------

-5-----------------------------------------------------------------------------------------------------
 关于词法(my)变量
   词法变量可以在任何语句块内,而不仅仅限制于子程序的语句块,可以在if, whileforeach的语句中使用。

   foreach (1..10)
   {
      my($square) = $_ * $_;  #该循环中的私有变量
      print "$_ squqre is $square\n";
   }

   词法变量的作用域(scope)受限于定义它的最内层语句块(或文件)。只有语句块上下文作用域内的程序代码才能以
   $square这个名称使用该变量。
-5-----------------------------------------------------------------------------------------------------


-6-----------------------------------------------------------------------------------------------------
 return操作符
   如果在子程序运行到一半时停止执行,那该怎么办?这正是return操作符要做的事情,它会立即停止并执行并从子
   程序内返回某个值。

   my @names =qw/fred barney betty dino wilma pebbles bam-bam/;
   my $result = &which_element_is("dino",@names);

   sub which_element_is
   {
       my($what,@array)=@_;
       foreach(0..$#reuslt)
       {
           if($what eq $array[$_])
           {
             return $_;  #一旦发现就停止
           }
       }
       -1;
   }
-6-----------------------------------------------------------------------------------------------------


-7-----------------------------------------------------------------------------------------------------
  持久性私有变量
     在子程序中可以使用my操作符来创建私有变量,但每次调用这个子程序的时候,这个私有变量都会被重新定义。
     而使用state操作符来声明变量,我们便可以在子程序的多次调用期间保留变量之前的值,并将变量的作用域局限
     于子程序内部。

     sub test1
     {
        my $n +=1;  #使用my声明变量,语句块一结束,它的值就会被抛弃
        print "hello, the number is $n\n";
     }

     &test1();  #1
     &test1();  #1 

     use v5.14;
     sub test2
     {
        state $n = 0;
        $n +=1;
        print "Hello, The number is $n\n";
     }
     &test2; # resust is 1
     &test2; # resutl is 2

    求总和:

    use v5.14;
    sub total_sum
    {
        state $sum = 0;
        state @numbers;

        foreach my $number (@_)
        {
            push @numbers,$number;
            $sum += $number;
        }
        say "The sum of (@numbers) is $sum\n";
    }
    &total_sum(5,6); #11
    &total_sum(1..3); #17
    &total_sum(4);  #21
-7-----------------------------------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值