您的位置:首页 > 其它

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

2016-04-05 21:57 260 查看
看师兄的程序,里面用了很多箭头->。很长时间没有使用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就象一个普通的标量,在函数调用和返回时,就可以直接使用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: