很多人已经在这里给出了正确的答案。我想添加一个我觉得很有启发性的例子。您可以阅读perldoc perlref中的文档以获取更多信息。
您的问题是歧义之一,您有两个操作$$
并[0]
使用相同的标识符_
,结果取决于首先执行哪个操作。我们可以通过使用支持花括号来减少歧义${ ... }
。$$_[0]
可能(无论如何对于人类)可能意味着:
${$$_}[0]
-- 取消引用标量$_
,然后取其第一个元素。
${$_[0]}
-- 获取0
数组的元素@_
并取消引用它。
如您所见,这两种情况指的是完全不同的变量,@_
并且$_
.
当然,对于 Perl 来说,这并不是模棱两可的,我们只需选择第一个选项,因为取消引用是在键查找之前执行的。我们需要支持花括号来覆盖此取消引用,这就是为什么您的示例在没有支持大括号的情况下无法“工作”的原因。
您可能会考虑为您的子例程提供一个稍微不那么容易混淆的功能。您可以分两个阶段进行,而不是尝试一次做两件事(获取参数并取消引用它):
sub foo {
my $n = shift;
print $$n;
}
在这里,我们用 取消第一个参数@_
,shift
然后取消引用它。干净简单。
但是,大多数情况下,您不会使用对标量变量的引用。在这些情况下,您可以使用箭头运算符->
my @array = (1,2,3);
foo(\@array);
sub foo {
my $aref = shift;
print $aref->[0];
}
我发现使用箭头运算符比$$
语法更可取。