#声明与调用
sub hello{
say "hello";
}
hello(); #5.0以下版本调用函数方式:&hello();
子程序传参:参数保存在@_列表里。参数为数组时,会按元素进行拆分传递
sub hello{
foreach(@_){
say "hello $_"; #默认循环变量$_
}
say "first para:$_[0]"; #直接访问参数列表@_的元素,此处为第一个参数
say "second para:$_[1]";
}
hello("a","b");
my $var = 1;
my @array = qw(2 3 4);
hello($var,@array); #second para:2
hello(@array,$var); #second para:3
子程序返回值:有return返回return值,否则返回最后一行值
sub add{
$_[0]+$_[1]; #同 return $_[0]+$_[1];
}
add(1,2); #3
sub return_bollean{
say $_[0]; #此种语句作为返回值,返回执行的布尔结果值:执行成功返回1
}
print return_bollean(1) #可以不用分号,不能加“”
私有变量
- my声明词法作用域变量,从声明开始有效,直到闭合作用域结尾({}中),子程序调用的子程序中无效。(our声明的为全局变量)
- local可临时将全局变量变为局部变量,退出作用域后,全局变量恢复前值;子程序调用的子程序中也有效。
- state声明静态变量,同sv中的static。
...
my $var = 0;
#my $var2 = 10; my变量不能再用local声明
our $var2 = 10;
sub printVar{
say $var; #打印localVar外的变量值0
say $var2;
}
sub localVar{
my $var = 1; #my变量在子程序中不起作用
local $var2 = 11;
say $var;
say $var2;
printVar(); #0,11
#global $var #wrong,没有global,sv中有
our $var = 3;
say $var; #3
printVar(); #say $var值仍为0
}
localVar();
say $var; #0
say $var2; #10