Perl中"—>"箭头的意义及用法

来源:互联网 发布:自动组词软件 编辑:程序博客网 时间:2024/06/05 18:35

看师兄的程序,里面用了很多箭头->。很长时间没有使用perl编程了,很多基本概念忘记了。在网上搜了很久,终于找到比较靠谱的答案。


cited from http://write.blog.csdn.net/postedit flw的回答。有部分增改。


-> 有两种用法,都和解引用有关。 

第一种用法,就是解引用。 
根据 -> 后面跟的符号的不同,解不同类型的引用, 
->[] 表示解数组引用,->{} 表示解散列引用,->() 表示解子程序引用。 
例子: 
$arr_ref = \@array; 
$arr_ref->[0] 访问数组 @array 的第一个元素。 
$hash_ref = \%hash; 
$hash_ref->{foo} 访问 %hash 的 foo 分量 
$sub_ref = \&test; 
$sub_ref->(1, 2, 3) 使用参数列表 (1,2,3) 来调用 &test 这个子程序。 

第二种用法,就是调用类或者对象的方法。 
格式: 
$obj->method();##简单来说,就是函数表示的一种。等价于method($obj)
或者 
ClassName->method(); 
例如: 
$pop3->login( $username, $password ); 
my $ftp = Net::FTP->new("some.host.name", Debug => 0); 
这两种用法略有不同, 
但是总的来说,符合以下规则: 
引用:假设 -> 的左操作数(就是左边那个值,如 $pop3 和 Net::FTP)是 $left,右操作数(就是右边那个值,如 login 和 new)是 $right,那么 -> 的运算规则就是: 

if ( ref $left 有效 ){    # 也就是说 $left 是个引用,而不是个裸字    $ClassName = ref $left;  # 取引用的类型,当作类名称}else{    $ClassName = $left;       # 直接把裸字当作类名称}


然后调用: 
&{$ClassName::$right}( $left, 原参数列表 ) 

也就是说把类名称和右操作数拼在一起,当作子程序名称(Perl 解释器要做的工作其实要比这复杂,它还要考虑到继承的问题),并把左操作数当作第一个参数。 



附加:perl中的“指针”。箭头不是指针!!

引自:Perl语言中的“指针”用法解析_架构设计_技术方案_中国软件网  http://tech.soft6.com/664/8/35840.html

在C语言中,指针(地址)的使用给我们带来了很大的方便,但是在Perl语言中没有直接提供这样的数据类型,在某些情况下就存在一些很不方便的地方

在调用函数时,如果参数值和返回值比较多,而且非常复杂的时候,仅仅是参数栈或返回值栈是不够用的。这时候,有两种解决方法,一种是使用引用调用,这样可以传递象数组、哈希数组一类的数据,另外一种就是我要着重介绍的“指针”,主要用来传递复杂的结构,例如多维数组。多维数组指针的创建

Perl语言中多维数组指针的创建非常简单,具体语句如下:
my$multi_array=[];

这时,$multi-array就是一个指针,它的内容是undefined.下一步我们要给它赋值,语句如下:
@{$multi_array}=((a,...,z),(1,...,10),($a,...,$xx));

这时,$multi-array就成了一个指向二维数组的指针,当然,如果必要的话,你可以定义更多的维数。如何使用这个二维数组的元素呢?

$multi_array->[0][1]#数组第一维,第二个元素

如何使用一行元素呢?
@{$multi_array->[0]}#二维数组的第一行元素

这样,你就可以方便的借助指针使用多维数组了。标量$multi_array就象一个普通的标量,在函数调用和返回时,就可以直接使用了。



0 0
原创粉丝点击