子程序的定义可以使用关键字 sub 子程序名(不包含&),以及经过缩进的花括号

$n=1;

&marine;
&marine;
&marine;
 sub marine{

     

     print "Hello $n\n";

     $n+=1;

     }

子程序可以在程序的任意位置,如果提前使用在后定义的话,也不用事先声明,只是子函数只能是定义,经过调用后才会执行,不会自动执行

注:

子程序的定义是全局的,不存在私有子程序的说法,如果定义了重名的子程序,那么后面的额子程序会覆盖掉前面的子程序,一般现在见过的所有变量都是全局变量

子程序的返回值:

PERL子程序都是具有返回值的,其返回值就是最后一次运算的结果

$tmp=&marine;
 print $tmp;
 sub marine{
     $n+=1;
     print "Hello $n\n";#print语句返回的是1,表示输出成功
     }$tmp输出的结果是1
$tmp=&marine;
print $tmp;
sub marine{
    print "Hello $n\n";
    $n+=1;
    }#这样的结果则是2

另外最后执行的表达式与代码中的最后一行并不相同

$m=4;
 $n=6;
 $result=&la_or_le;
 print $result;
 sub la_or_le{
 if($m>$n)
 {
     $m;
 }
 else
 {
     $n;
 }
     
 }

PERL子程序,可以有参数,传递参数列传递到子程序中去,只要在子程序调用的后面加上括号即可

PERL自动将参数列表化为名称是@_的特殊的数组变量,该变量在子程序执行期间有效

$result=&la_or_le(1,2);
 print $result;
 sub la_or_le{
 if(@_[0]<@_[1])    
 {
     @_[1];
 }
 else
 {
     @_[0];
 }
 }

我们可以看到这里面只用到了参数的前两个如果是&la_or_le(1,2,3);的话呢?也没关系,第三个参数就自动忽略了

同样,如果用到的参数超出了@_的边界的话,就会是undef

对于如果已有了全局变量@_。则该变量在子程序调用之前会先被保存起来,并且在子程序返回时恢复原本的值即使程序自己递归调用自己也是这样,不会影响到本次执行过程

中的@_变量