微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl 子例程传参总结

Perl 子例程参数有三种类型的数据,标量,数组(表), Hash表。

一、最基本的就是直接传入参数,即是直接将表或者标量传入函数

 sub func1 () { 
     my ($argv0,$argv1) = @_; 
 # Todo ... 
 } 
   
 my $val0 = 1; 
 my $val1 = 2; 
  
 my @vals = ($val0,$val1);  
  
 &func1 ($val0,$val1); 
 &func1 (@vals); 
 

此时,传入的参数就是最简单的标量和列表。


二、除此之外,也可以传入指针类型。指针其实是perl中的硬指针概念,很像C中的指针。即是用一个标量存储一块内存区域的地址。

指针的获取可以使用perl中的取址符号 “ \ ”得到,用法也很像C中的取址符 "&":

my &ptr = \@array;

sub func ($$$) {       # 限制只传入三个标量参数
    my ($name,$keys,$vals) = @_; 
    my $str = "my \%$name = (\n"; 
    my $cnt = scalar (@$keys); 
    if ($name && $keys && $vals) {   
        for (my $i = 0; $i < $cnt; $i ++) { 
            $str .= "\"$$keys[$i]\" => $$vals[$i],\n"; 
        } 
    } 
    $str .= ");"; 
 } 
 my @keys = ("java","c++","c","c#","perl","sql","vb"); 
 my @vals = (1..7);   

 my $res = &func ("my_hash",\@keys,\@vals);

(注:为函数传入hash表名称,key链表,vals链表,打印出perl 定义hash表的代码)

指针是标量,传入后对指向的数据进行操作,将改变此地址中的数据。

三、最后说一种传入参数的方法。使用typeglob 传入, 即是一种别名机制,又称为符号引用,很像linux中的软链接。这种方法并现在使用比较少。要创建它,在实际的变量前面加一个 “*” 号即可。适用于任意类型,标量、数组、hash、文件句柄、子例程等。如 *x 既可表示$x,也可表示 @x、%x、&x

 our $x = "abcd";
 our @x = (1..6);
 &funcx (*x);
 sub funcx {
     local *p = shift;
     print *p."\n";    # main::x;
     $p = "efgh";   # scalar $x is changed!
     @p[2] = "____";
 }
  
 print $x."\n";
 print @x;
$p = "efgh"; #这一行将改变$x 标量的值;

@p[2] = "___";   # 这一行改变@p数组第3个元素的值变为 “___”;


访问指针指向的数据方法总结:

my $ptr = \$val;          # 取值方法: $$ptr

my $ptr = \@vals;      # 取值方法: @$ptr 或者 $$ptr[index]

my $ptr = \%hash;     # 取值方法: %$ptr  或者 $$ptr{key}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐