【perl】函數的參數變量和返回值

函數返回值

在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

ref:link1    link2

猜你喜欢

转载自blog.csdn.net/lbt_dvshare/article/details/85054675