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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |