加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 子例程传参总结

发布时间:2020-12-15 23:47:58 所属栏目:大数据 来源:网络整理
导读:Perl 子例程参数有三种类型的数据,标量,数组(表), Hash表。 一、最基本的就是直接传入参数,即是直接将表或者标量传入函数: sub func1 () { my ($argv0,$argv1) = @_; # TODO ... } my $val0 = 1; my $val1 = 2; my @vals = ($val0,$val1); func1 ($va

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}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读