Perl语言程序设计_子程序

子程序简介

Perl语言中的子程序,本质上就是其他编程语言(例如C语言或者C++)中的函数。Perl语言本身就含有一些函数,例如chomp函数用来获取用户输入的字符串并删除其结尾的换行符;reverse函数可以将数组中元素的顺序颠倒;print函数可以用于输出……而子程序就是用户定义的程序,也就是用户自定义的函数。其目的在于可以重复利用某段经常使用的代码,简化程序并让程序的逻辑更为合理。

子程序的命名包括关键字、名称、代码块这三个要素。子程序的关键字为sub,在关键字sub的后面接子程序的名称。如果计划写一个匿名的子程序或者封包,则可以省略子程序的名称。子程序的名称也属于Perl标识符的范畴,因此,起名字的时候务必由字母、数字和下划线组成,且不能以数字开头。子程序有自己独立的命名空间,因此,就算子程序的名称与程序中别的标量重复,Perl程序也不会混淆二者,&fred和$fred是完全两个不同的东西。在Perl语言中,子程序是全局的,也就是说可以在程序的任意位置定义子程序,而不需要提前声明,如果有两个子程序重名,后面的子程序会覆盖掉前面的子程序。子程序中的变量也是全局变量。

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

子程序的调用

一般使用与号“&”调用子程序。

sub marine {
    $n += 1;
    print "Hello, sailor number $n!\n";
}
&marine;#输出Hello, sailor number 1!
&marine;#输出Hello, sailor number 2!
&marine;#输出Hello, sailor number 3!

子程序的返回值

一般而言子程序在被调用的时候,都是作为表达式的某个部分,即子程序计算出来的结果是要被用到的。因此,需要子程序有一个“返回值”。对于别的语言,例如C语言或者C++而言,有的函数有返回值(return)而有的函数没有,但是在Perl语言中,是不存在这种区别的。Perl语言中的子程序一定有返回值,只是不一定所有的子程序都包含有用的返回值罢了。在子程序中最后一次运算的结果都会被自动的当成是这个子程序的返回值,无论这个值是什么。例如:

#sum1和sum2是两个求和子程序,print语句可以视为测试信息,确保子程序运行了
sub sum1 {
    print "The sum of the two number is:";
    $a + $b;#子程序的返回值是7
}
sub sum2 {
    $a + $b;#这个表达式不是返回值,因此Perl计算之后会将其丢弃
    print "The sum of the two number is:";
    #perl会将这个语句视为返回值,如果正常输出,返回值就是1,如果没能正常输出,返回值就是i0;
}
$a = 3;
$b = 4;
$sum1 = &sum1;#sum1的结果为7
$sum2 = &sum2;#sum2的结果为1

因此在写Perl子程序时,务必分外小心,看清楚每个子程序的返回值究竟是什么,务必确定它确实是我们需要的返回值。

子程序参数

Perl语言中的子程序是可以带参数的。如果要使用带参数的子程序,就只需要在调用子程序时在名称后面加上被括号圈引的列表表达式就可以了。在调用子程序的过程中,参数列表会被传入到子程序中,让子程序随意使用。子程序使用这个参数列表的原理是,子程序拥有私有变量@_,首先将参数列表中的值赋给@_,然后在子程序运行的过程中按需求访问这个数组就可以了。@_跟别的数组完全一样,如果想使用其中的元素,可以根据下标进行定位,例如$_[1],$_[0]……以此类推。

@_是子程序的私有变量,这意味着@_的值只在子程序内部可用。假设在Perl程序中原先就定义了一个@_的数组,那么在运行子程序的过程中,原先的@_的值会被暂时封存起来,然后生成一个新的@_数组以供子程序使用。待子程序结束之后,子程序中的私有变量@_会被释放,然后程序会将封存起来的值重新赋给@_。

子程序中的私有变量

在子程序参数中提到了@_,这是子程序默认的一个私有变量。除此之外,子程序还可以设定其他私有变量。我们可以借助my操作符来创建私有变量,也称为词法变量。例如:

sub max {
    my ($m, $n) = @_;#该语句块中的私有变量
    if ($m > $n)
        $m;
    else
        $n;
}

在上述例子中,$m和$n就是这个子程序中的私有变量。无论哪个Perl程序调用这个子程序,无论该Perl程序中是否有$m或者$n,都不会对这个子程序中的$m和$n造成任何影响。这也可以有效地避免在程序调用的过程中出现一些意料之外的错误。

另一方面,my不光可以在Perl子程序中创建私有变量,在if、while、foreach的语句块中都可以使用这种用法。

持久性私有变量

Perl程序中的私有变量只能在对用的子程序或者if、while、foreach代码块中存在,如果多次调用这个子程序,那么子程序中的私有变量会一次次地被重新定义。如果想提高效率,在多次调用期间保持变量之间的值,可以使用state操作符。这个操作符会将变量的作用域局限于子程序内部。

假设子程序中存在一个变量$n,在声明这个变量的时候如果在前面加上state,那么对Perl程序而言,变量$n从未被定义,如果在子程序外使用$n,则Perl程序会报错。另一方面,我们无法再用my声明$n为此法变量。因为词法变量是无法存续的,当这个语句块结束的时候,它就会被抛弃,而$n是一个持续性私有变量,语句块结束的时候不会被抛弃,因此不能再用my声明。

return操作符

在别的语言中,return往往用来表达函数中的返回值。在Perl语言中,return有着类似的作用,它会里立即停止子程序的致行,并冲子程序内返回一个值。例如:

my @names = qw (fred barney betty dino Wilma pebbles bamm-bamm);
my $result = &wich_element_is ("dino", @names);
sub which_element_is {
    my ($what, @array) = @_;
    foreach (0..$#array){#数组@array中所有元素的索引
        if ($what eq $array[$_]){
            return $_;#一旦发现就直接结束子程序并返回
        }
    }
    -1;#没有找到合适的元素
}

上述例子就是return的一个应用。从一个数组中依次遍历,寻找一个字符串。如果字符串匹配上了,就立刻结束这个子程序,并且返回该字符串对应的索引。

另外,如果担心在写子程序的时候搞错返回值,可以在子程序的结尾加上return,用来明确返回的是哪个变量,避免程序出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值