gpt4 book ai didi

perl - 在 $_[0]、$_[1] ..... 的情况下取消引用

转载 作者:行者123 更新时间:2023-12-04 10:18:35 25 4
gpt4 key购买 nike

请看下面的代码:

$scalar = 10;

subroutine(\$scalar);

sub subroutine {
my $subroutine_scalar = ${$_[0]}; #note you need the {} brackets, or this doesn't work!
print "$subroutine_scalar\n";
}

在上面的代码中,您可以看到注释“注意您需要 {} 括号,否则这不起作用!” .请解释为什么我们不能使用与以下相同的语句:
my $subroutine_scalar = $$_[0];

即不使用大括号。

最佳答案

很多人已经在这里给出了正确的答案。我想添加一个我觉得很有启发性的例子。您可以阅读 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];
    }

    我发现使用箭头运算符比 $$ 更可取句法。

    关于perl - 在 $_[0]、$_[1] ..... 的情况下取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19449075/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com