Perl
中->
和$
之间的区别是什么?
其中->
是中缀解除引用运算符。
$
也是解除引用运算符。
这个算子的确切含义是什么?
答案 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显示了如何更改某些$
表达式以使用->
。