2013-04-25 78 views
0

就是在Perl是什么含义 - >和Perl中

->$之间的区别在哪里->是缀引用操作$。

$也是解引用运算符。

此运算符究竟意味着什么?

+2

我不确定为什么人们会这样做。这是一个有效的问题。 – 2013-04-25 19:35:27

+0

@ D.Shawley如果这是一个有效的问题,那么为什么你不喜欢呢? (国际海事组织的人没有足够的提问) – 2013-04-25 19:41:50

+0

一些有用的参考。 [Mini-Tutorial:Dereferencing Syntax](http://www.perlmonks.org/?node_id=977408),[参考快速参考](http://www.perlmonks.org/?node_id=69927),[perlref] (http://perldoc.perl.org/perlref.html),[perlreftut](http://perldoc.perl.org/perlreftut.html),[perldsc](http://perldoc.perl.org/perldsc .html),[perllol](http://perldoc.perl.org/perllol.html) – ikegami 2013-04-25 20:05:19

回答

0

我的Perl是有点生疏,但$总是意味着以下是一个标量名称。箭头运算符(->)是一个非常不同的野兽。这意味着解引用名称和然后适用以下运算符。以下是来自perlref(1)一个例子:

因为能够省略花括号为$$x简单的情况下,人们往往 使观看解引用符号正确的运营商的错误,不知道 他们的优先级。如果他们是,但是,你可以使用括号而不是 括号。事实并非如此。考虑下面的差异; 0的情况下是一种短手 版本情况1,案例2:

$$hashref{"KEY"} = "VALUE";   # CASE 0 
${$hashref}{"KEY"} = "VALUE";  # CASE 1 
${$hashref{"KEY"}} = "VALUE";  # CASE 2 
${$hashref->{"KEY"}} = "VALUE";  # CASE 3 

案例2也是骗人的,你访问一个名为%hashref, 不取消引用变量通过$hashref到哈希这大概是参考。 这将是案例3.

+0

$不是标记变量名称的信号,除了sigil外还有其他用途。 – 2013-04-25 20:40:22

7

我不能足够强烈地推荐核心文档参考教程,perldoc perlreftut,由备受尊敬的观众Mark Jason Dominus编写。它很简洁,并教导了一些创建和使用引用的简单规则。

我不是说RTFM,我说的是,在这一点上有一个伟大的文档,找出它,它会帮助你!

+2

你说的是RTM :) – DVK 2013-04-25 20:50:20

+0

我猜我是,但我笑着说:-) – 2013-04-25 22:47:22

4

是的,$->都是解引用运算符,尽管它们有很大不同。

Perl允许您将引用转换为其他数据。这些与一些语言中的指针大致相似。要获得原始数据结构,我们必须解除引用他们。这通常涉及花括号(可以在微不足道的情况下省略)和我们正在引用的类型的印记。 (大多数值只能被取消引用到一种类型,否则会引发错误)。

${ $scalar_ref }; 
@{ $array_ref }; 
%{ $hash_ref }; 
*{ $glob_ref }; 
&{ $code_ref }(@args); 

如果$type_ref仅仅是一个变量,在花括号可以省略,但他们实际的,当我们有更复杂的表达式。

现在的问题是访问哈希或数组中的字段,而不分配给中间哈希。这就是->运算符用于:

# instead of 
my %hash = %{ $hashref }; 
my $field = $hash{field}; 
# we can do this and avoid unneccessary copying :) 
my $field = ${$hashref}{field}; # curlies around $hashref optional 
my $field = $hashref->{field}; 

类似的阵列,coderefs和方法在对象上调用

$array_ref->[$index]; $$array_ref[$index]; 
$code_ref->(@args);  &$coderef(@args); 
$object->method(@args); 

其实,->运营商确实在方法调用的背景是什么(或者看起来像他们)有点复杂,但这似乎并不是你的问题。

对于arrayrefs和hashrefs,你可以想像,$$ref[$i]般提领只是替换$ref与阵列,其中它在象征意义的名字:$array[$i]。所以第一个是数组元素的sigil,第二个是标量持有参考的$