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。
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。