legend

思考助我前行

perl学习日记4 子程序

1.    子程序

函数的命名空间和列表,标量一样,都是独立的,不用担心重名

1.1      定义一个子程序

sub marine {

$n + = 1; #全局变量$n

print “Hello, sailor number $n!/n”;

}

 

都是全局变量,私有变量前加my就行了

1.2      调用子函数

&marine; #输出Hello, sailor number 1!

&marine; #输出Hello, sailor number 2!

&marine; #输出Hello, sailor number 3!

&marine; #输出Hello, sailor number 4!

1.3      返回值

子函数里最后一条语句的值为返回值

如果最后是print 返回的是1,因为它打印成功就会返回true,在特定的环境下就是1

例子:

sub larger_of_fred_or_barney {

if ($fred > $barney){

$fred;

}else{

$barney;

}

}

1.4      参数

此参数列表被传到子程序中;这些参数可以被子程序使用。当然,这些参存放在某个地方,在Perl 中,会自动将此参数列表(此参数列表的另一个名字)自动存放在一个叫做@_的数组中。子程序可以访问次数组变量来确定此参数的个数以及其值。需要注意实际上@_和参数列表是同一个东西,你程序中改了他,也就改了传入的变量。

每个子程序的@_都是独立的,程序相互调用,递归等都不会有问题。

1.5      子程序中的私有变量

sub max {

my($m,$n); #新的,私有变量

($m,$n) = @_; #赋值

if($m > $n) {$m} else{$n}

}

 

私有变量的改变和@_没有关系,所以和转入的参数也没有关系。

1.6      子程序参数个数

sub max{

if(@_!=2){

print “WARNING! &max should get exactly two arguments!/n”;

}

#continue as before….

.

.

.

}

在设计程序时应该充分考虑转入参数各种个样的情况。

1.7      局部变量的作用范围是以块为单位的,块就是if,while,foreach这种有大括号的地方。

#!/usr/bin/perl

my $a = "love";

if(true)

{

my $a = "legend";

print $a."/n";

}

print $a."/n";

结果:

legend@ubuntu:~/data/study/perl$ perl 4.7

legend

love

 

申明是注意写法:

my $fred, $barney; #错误!没有定义$barney

my ($fred, $barney); #两个均定义了

1.8      Strict pragma用法

use strict; #迫使采用更严格的检测

实际上感觉和warning差不多,只不过检测的严格性加大了

1.9      Return语句

我们一样很需要return语句,因为有时你需要在子程序中某个地方就直接返回。

所以perl一样支持显示的retrun语句。

1.10 关于&

必须要的时候:

调用的是自己定义的子函数,而且调用发生在定义前面

自己定义了和系统函数重名的子函数,要调用它就必须用&,好和系统函数区分。

可以省的时候,一句话,只要编译器不会觉得有歧义,就可以省。

sub division{

$_[0] / $_[1]; #第一个参数除以第二个参数

}

my $quotient = division 355, 113; #可以省略掉括号,这种省了括号的要注意下

1.11 关于非标量的返回值

Perl可以返回非标量,列表,如果最后一条语句是列表或者给一个列表赋值,当然返回的就是列表,如果直接用retrun后不接任何东西,则返回undef

阅读更多
文章标签: perl 编译器 ubuntu
个人分类: study_log
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭