是什么意思 - >和Perl中的$

时间:2013-04-25 19:19:47

标签: perl

Perl

->$之间的区别是什么?

其中->是中缀解除引用运算符。

$也是解除引用运算符。

这个算子的确切含义是什么?

4 个答案:

答案 0 :(得分:7)

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

我不是说RTFM,我说,在这一点上有一位很棒的博士,找到它,它会帮助你!

答案 1 :(得分:4)

是的,$->都是取消引用运算符,即使它们完全不同。

Perl允许您将引用用于其他数据。这些与某些语言中的指针大致相似。要获得原始数据结构,我们必须取消引用它们。这通常涉及花括号(在普通情况下可以省略)和我们解除引用的类型的符号。 (大多数值只能解除引用一种类型,否则会抛出错误。)

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

如果$type_ref只是一个变量,可以省略curlies,但是当我们有更复杂的表达式时它们是实用的。

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

# 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};

类似于对象上的数组,代码引用和方法调用

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

实际上,->运算符在方法调用(或看起来像它们)的上下文中所执行的操作稍微复杂一些,但这似乎不是您的问题。

对于arrayrefs和hashrefs,你可以想象$$ref[$i] - 像dereference只是将$ref替换为数组的名称,它在符号意义上代替$array[$i]。所以第一个$ sigil是数组元素,第二个$是持有引用的标量的。{/ p>

答案 2 :(得分: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.

答案 3 :(得分:0)

他们可以通过不同的方式做同样的事情。

http://perlmonks.org/?node=References+quick+reference;规则3显示了如何更改某些$表达式以使用->