SOURCE HTML: http://socvista.com/bbs/redirect.php?fid=71&tid=903&goto=nextnewset
12:28 第四章 -- subroutine子程序 (1)
-- 定义子程序
sub marine {
$n += 1;
print "hello, sailor number $n!\n";
}
-- 子程序都是global的。
-- 调用子程序
&marine; # hello, sailor number 1!
&marine; # hello, sailor number 2!
-- 返回值
Perl将最后一个表达式的结果作为返回值。因此没有显式声明。
sub sum_of_ab {
print "something....!\n";
$a + $b; # this is the return value
}
调用返回值的方法:
$sum = &sum_of_ab;
注意,最后一个表达式不要使用 print语句。如果使用了print语句则print的执行结果1(表示正常)就会作为返回值,从而造成和期望不一致。
-- 参数
Perl中所有子程序的参数都自动进入@_变量,这个变量是一个local私有的变量,出了子程序就无效了。而且不管子程序如何嵌套都不会出错,每一级都有其自身的@_。
调用参数时,采用$_[0]、$_[1]这种方式来获取第0、1个参数。
-- 子程序中的私有变量
默认情况下,变量都是global的。
用my操作符可以将变量定义成私有的,也就是只在当前的block内有效。
sub max{
my ($m, $n);
($m,$n)=@_;
if ($m > $n) {$m} else {$n};
}
-- 变量定义与初始化
my($m,$n) = @_;
13:27 第四章 -- subroutine子程序 (2)
-- 变量长度识别
由于Perl遵循“no unnecessary limits”的理念。因此参数的长度并没有限制。为此,需要在程序中做一下长度的检查。
sub max{
if (@_ != 2) {print "Warning! &max should get exactly 2 arguments!\n"};
# .... omitted.
}
-- 任意长度参数的处理方法
看一下这个例子,照着学一下就可以了。触类旁通,哈。
使用方法:$maximum =&max(3,4,10,5,6);
程序定义:
sub max {
my ($max_so_far) = shift @_;
foreach (@_) {
if ($_ >$max_so_far) {$max_so_far = $_};
}
$max_so_far;
}
这里提到了对任意长度的处理方法:是用foreach循环处理掉。
-- 关于my操作符
my变量只在enclosing block有效。这个enclosing block就是包裹着my的block,可以是一个subroutine,也可以是一个foreach循环。
另外my不会改变list/scalar的context。
13:51 第四章 -- subroutine子程序 (3)
-- 使用use strict pragma
所谓 pragma是给compiler用的一种暗示指令。
由于perl过于宽松,代码一长就容易产生错误。为此,使用use strict来规范代码。
使用方法:use strict;
效果是所有变量都必须先声明再使用,一般用my来完成变量声明。
当然$_,@_这些内置变量不需声明。
一个推荐的做法是当程序长度超过一屏的时候就应该使用use strict了。
-- return 操作符
一般情况下subroutine的最后一行返回值,但是有时候需要在中间执行完后就返回值并退出。这时就可以用return语句了。和C语言类似,不再赘述。
return $_;
14:08 第四章 -- subroutine子程序 (4)
(大盘有上涨的趋势)
-- 何时可以不用& (ampersand)
这个符号是用来帮助编译器识别用户自定义subroutine的,因此如果能使编译器意识到这一点则无需&符号。情况:
1. 如果subroutine使用的时候带有参数,compiler会意识到。
2. subroutine定义在先,使用在后。
如果自己定义的函数和built-in同名,必须使用&符号加以区别。
-- 返回值可以是List类型
sub list_from_atob {
if ($a < $b) { $a..$b }
else {reverse $b..$a}
}