子程序的定义是全局的,不需要事先声明。若重复定义子程序,后面的覆盖前面的。
sub marine {
$n +=1;
print " Hello ,sailor number $_ ! ";
}
调用:&marine;
返回值:最后一次的运算结果会被当作返回值。
变量:所有变量默认为全局变量
参数:@_为subroutine 的私有变量。若恰有全局变量@_ 则调用子程序时存起,子程序结束会自动恢复。
$_[0] $_[1] $_[2] ...存于数组变量@_
sub max {
if (@_ != 2) { print " “};
if ($_[0] > $_[1]) {
print " ";
}
}
&max(13,29) ;
example2:
$maxmun = &maxh(2,8,32,44,9);
sub maxh {
my ($max_so_far) = shift @_ ;
foreach (@_) {
if ($_ > $max_so_far) { $max_so_far = $_ };
}
$max_so_far;
}
私有变量: my
sub max {
my ($m,$n) = @_ ; #子程序私有变量;和子程序外的世界互不相犯
}
作用域受限于定义它的最内层语句块/文件 #语句块为foreach等。
my 操作不会改变赋值时的上下文
my ($num) = @_ ; # 列表上下文 等同于 ($num) = @_
my $num = @_ ; #标量上下文 等同于 $num = @_
my $fred,$baney # 错,没有声明$baney
return:立即停止执行,并返回某值。
sub which {
foreach ( ) {
if ( ) {
return $_;
}
}
return -1 ; #或省略return 指查无此值,没有找到符合条件的元素
}
省略&号:
和内嵌函数同名时,不能省略&。 比如自定义一个函数chomp() ,调用时必须使用&chomp
非标量返回值:
sub listx {
if ($a < $b) {
$a..$b
} else {
reverse $a..$b
}
@c = &listx(11,6) ;# 11,10,9,8,7,6
持久性私有变量:state 多次调用子程序期间,保留该变量每次的值。适用于未定义的全局变量这种情况,my私有变量每次调用结束,就会抛弃存值。