函數返回值
在Perl中,return语句可以返回一个标量值或者一个列表,这个标量值可以是一个变量,或者一个表达式的最后求值,如:return 1;<===>return(1); return $a+$b; <===>return($a+$b);
一个Perl函数的返回值,并不止一个,有时会有多个值需要返回,這時就要用到列表,这个列表可以包含多个变量值。
返回單一變量
subget_value()
{
my $var;
$var=1;
return($var);
}
my $result;
$result = get_value();
print "\$result = $result \n";
返回多個標量
subget_value() {
my($var_a,$var_b);
$var_a=1;
$var_b=2;
return($var_a,$var_b);
}
my ($result_a,$result_b);
($result_a,$result_b) = get_value();
返回多個數組
sub get_value()
{
my(@$var_a,@var_b);
@var_a=(1,2);
@var_b=(30,40);
return(\@var_a,\@var_b);
}
my (@result_a,@result_b);
my ($result_a_ref,$result_b_ref);
($result_a_ref,$result_b_ref)=get_value();
#here need to encode the reference
@result_a=@$result_a_ref;
@result_b=@$result_b_ref;
print"\@result_a=@result_a\n\@result_b=@result_b\n";
#######print resultis:
@result_a=1,2
@result_b=30,40
参数中传递数组
sub getarrays{
my(@a,@b) = @_; # @_ 是默认的包含本函数所有参数
...
}
@fruit = qw(apples oranges banana);
@veggies = qw(carrot cabbage turnip);
getarrays(@fruit, @veggies);
预期 @fruit 会赋值给@a,@veggies赋值给@b,其實不然。
在调用getarrays(@fruit, @veggies)時,其把参数@fruit 和 @veggies压缩到单个数组@_中。
这样在getarrays函数内部,就会把@_赋值给@a,即@fruit和@veggies都赋值给@a.
传递参数引用可以很好的解决这个问题。即我们没有必要传递整个数组,只要传递相关数组的引用就可以了。
引用一律声明为标量类型(即$开头的命名变量),使用\运算符取引用
对引用变量的修改等同于对引用指向实际数据的修改
取标量变量引用:my $scalar_r = \$scalar;
取列表的引用:my $array_r = \@array;
取哈希的引用:my $hash_r = \%hash;
1、一般的标量Perl引用
sub add{ my($a,$b)=@_; $$a++; $$b++; }
$a=1; $b=2;
add(\$a,\$b); print "$a,$b\n"; # 输出:2,3。
说明:取变量的Perl引用可以用“\”符号,解Perl引用用“$”符号。
2、数组的Perl引用
数组的Perl引用和标量的Perl引用一样,在数组名前面加“\”,只是在解Perl引用的时候,使用@符号。如:
@abc=(1,2,3);
$ref = \@abc;
print “@$ref \n”; #输出1,2,3。
print “@$ref[0] \n”; #输出1。
3、对哈希表的Perl引用
和数组类似,但是当解Perl引用时要使用$符号,如:
%hash=(abc=>123, def=>456);
$ref=\%hash;
print "%$ref \n"; # 输出:%HASH(0x83179b4)
print "$$ref{abc}\n"; # 输出:123
引用的赋值
$aref2 = $aref1; 将使得$aref2和$aref1指向同一个数组,如果想将$aref1指向的数组拷贝一份给$aref2的话,使用下面的方法,[]里面对数组进行解引用,而[]以解引用后的数组为内容生成了一个新的匿名数组,又赋值给$aref2。
$aref2 = [@{$aref1}];
注意:不能使用下面的形式,外层的[]是不可缺少的。由于=左边是标量,所以右边的数组会被解释为标量环境,得到的是数组元素个数,而不是元素本身。但是如果加上[]就可以了,这样perl知道这是一个匿名数组的赋值。
$aref2 = @{$aref1};
判断一个变量是否是引用
my $aref1 = [1, 2, 0] ;
print ref $aref1, "\n" ; #输出 ARRAY
if (ref $aref1) {
print "true\n" ; #输出 true
}
判断两个引用是否指向同一个目标
my $aref1 = [1, 2, 0] ;
my $aref2 = $aref1 ;
print $aref1, "\n" ;
print $aref2, "\n" ;
if ($aref1 eq $aref2) {
print "reference equal\n" ;
}
if($aref1 == $aref2) {
print "reference equal\n" ;
}
例1:
sub getarrays{
my($fruit_ref,$veg_ref) = @_;
...
}
@fruit = qw(apples oranges banana);
@veggies = qw(carrot cabbage turnip);
getarrays(\@fruit, \@veggies);
例2:
sub func
{
my($a,$b,$c) = @_; # 这里$b,$c接收到的是数组的引用
print "$a\n";
my $count = 0;
while($count < @$b)
{
print "$b->[$count]\n";
$count++;
}
$count = 0;
while($count < @$c)
{
print "$c->[$count]\n";
$count++;
}
}
my @arry1 = ("fff", "rrr", "www");
my @arry2 = ("ttt", "hhh", "ccc");
func("qqq", \@arry1, \@arry2); # 这里传入数组的引用
二维数组
@a = {
(a,b,c,d,e)
(f,g,h,i,j,k)
(l,m,n,o,p)
(q,r,s,t,u)
(v,w,x,y,z)
}
从上述二维数组的每一行的数组中选出一个元素,列举出所有的组合方式.
例如可行组合(a,f,l,q,v),(b,h,o,s,z)等。
my @A = ( [ 1 .. 4 ], [ 'A' .. 'C' ], [ 'a', 'b' ], [ 10 .. 13 ] );
sub Combine {
my @R = @{ +shift };# @R = [1..4]
for my $e (@_) {
@R = map { my $r = $_; map "$r $_", @$e } @R;#其中@$e是參考引用
}
return @R;
}
my @w = Combine @A;
foreach my $t (@w){
print $t."\n";
}
#say for @w