-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, while或foreach的语句中使用。
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-----------------------------------------------------------------------------------------------------
子程序
最新推荐文章于 2022-12-06 13:15:59 发布