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 举报,一经查实,本站将立刻删除。