gpt4 book ai didi

arrays - 这个通过引用传递数组的示例在 Perl 中是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 09:32:35 25 4
gpt4 key购买 nike

当我偶然发现这个 S.O. 时,我正在看一篇关于如何用标量传递数组(或列表)的文章。发布... Passing By Value - S.O.

我发现所选的答案解决方案有效,但由于我正在尝试学习 Perl,我想知道它是如何工作的。在这一行

my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;

我看到作者将传递给子程序的输入参数放入标量变量中。然后,在这一行

@{$inArray}

他说“将引用用作数组”。他这句话的意思是什么?第二行到底发生了什么?我还没有见过那些运算符像这样组合在一起。

最佳答案

首先要记住的是arrays and lists are not the same

引用是一个标量,它保存其他东西的内存地址 - 数组、散列、另一个标量等。这是一种奇特的指针。

Perl 中的子例程采用参数列表(并返回结果列表。)当您想做类似的事情时,这是一个常见的绊脚石

mysub( @foo, @bar )

然后您意识到 @foo@bar 的元素在子例程中被扁平化为单个列表。如果您提前知道 @foo 的大小,您可以从列表的开头获取正确数量的元素,但通常您不会。

引用可以解决这个问题,因为它们是标量。如果您传递对 @foo@bar 的引用,您就知道您的子例程将始终有两个参数需要处理,无论引用数组的大小如何。

但是我们仍然需要获取这些数组中的数据。为此,我们必须告诉 Perl 去获取引用所指向的东西。这称为取消引用。

在 Perl 中,有两种常见的方法来取消引用数组引用:

  1. 要获取整个数组,请使用 my @array = @$ref;
  2. 要获取数组中的元素,请使用 my $elem = $ref->[42]

请注意,第一个示例有时会写成 @{ $ref },但不需要额外的花括号,除非您需要消除某些嵌套结构的歧义。有些人喜欢总是使用额外的卷发,但我发现它们会增加困惑并且通常是不必要的。

有关令人兴奋的引用主题的更多信息,请查看

  1. Perl reference tutorial
  2. Perl reference reference
  3. Perl data structures cookbook

关于arrays - 这个通过引用传递数组的示例在 Perl 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623281/

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