Perl->
和有什么区别$
中->
缀取消引用运算符在哪里。
$
也是解引用运算符。
这个运算符的确切含义是什么?
我不能强烈推荐核心文档参考教程perldoc perlreftut,由备受尊敬的 perler Mark Jason Dominus 编写。它简明扼要,并教授了一些创建和使用引用的简单规则。
我不是说 RTFM,我是说,在这一点上有一个很棒的文档,寻找它,它会帮助你!
是的,两者$
都是->
取消引用运算符,尽管它们完全不同。
Perl 允许您使用对其他数据的引用。这些与某些语言中的指针大致相似。要获得原始数据结构,我们必须取消引用它们。这通常涉及花括号(在琐碎的情况下可以省略)和我们要取消引用的类型的印记。(大多数值只能取消引用到一种类型,否则会引发错误)。
${ $scalar_ref };
@{ $array_ref };
%{ $hash_ref };
*{ $glob_ref };
&{ $code_ref }(@args);
如果 the$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,您可以想象 -like$$ref[$i]
取消引用只是简单地替换$ref
为数组的名称,它在符号意义上这样做:$array[$i]
. 所以第一个$
标记是数组元素的标记,第二个$
标记是保存引用的标量。
它们可以是做同一件事的不同方式。
见http://perlmonks.org/?node=References+quick+reference;规则 3 显示了如何$
更改某些表达式以->
代替使用。
我的 perl 有点生疏,但$
总是意味着以下是 scalar 的名称。箭头运算符 ( ->
) 是一个非常不同的野兽。这意味着取消引用名称,然后应用以下操作符。以下是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。