在Perl中传递标量引用

use*_*275 6 perl scalar arguments reference

我知道将标量传递给sub实际上是通过引用,但由于我是perl的新手,我仍然进行了以下测试:

#!/usr/bin/perl
$i = 2;
subr(\$i);
sub subr{
    print $_[0]."\n";
    print $$_[0]."\n";
}
Run Code Online (Sandbox Code Playgroud)

我认为第一行是打印一个地址,第二行是给回数,但第二行是空行.我被其他人指出要这样做:${$_[0]}它打印出数字.但她不知道为什么没有{}它不起作用以及为什么它与{}合作.那发生了什么?

Ed *_*ess 15

这是因为你的第二个印刷声明相当于这样做......

my $x = $$_; print $x[0];
Run Code Online (Sandbox Code Playgroud)

当你想要的是

my $x = $_[0]; print $$x;
Run Code Online (Sandbox Code Playgroud)

换句话说,取消引用发生在计算数组下标之前.

当你添加那些curl-wurlies时,它告诉perl如何解释你想要的表达式; 它将$_[0]首先评估,然后取消引用以获取值.


bot*_*403 8

这是一个评估顺序的事情.

  $$_[0] is evaluated as {$$_}[0]
Run Code Online (Sandbox Code Playgroud)

这是标量变量$ _的引用的第0个元素.它首先获取引用,然后尝试找到它的第0个元素.

  ${$_[0]}
Run Code Online (Sandbox Code Playgroud)

这是对数组@_的第0个元素的引用.它首先找到第0个元素然后参考它.

如果您设置use strictuse warnings在代码顶部,您将看到大量有关第一次尝试未定义值的警告.