【问题标题】:Perl multidimensional array accessPerl 多维数组访问
【发布时间】:2019-06-12 22:36:49
【问题描述】:

假设多维数组是这样的,

$myarray = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]];

尝试通过三种方式访问​​它,

print $myarray->[1][1] #prints 5
print $myarray->[1]->[1] #also prints 5
print $myarray[1][1] #prints nothing

我不知道第一种和第二种访问方式之间的区别。具体来说,第二个更明确,但第一个仍然有效。这迫使我认为第三个更好的工作也是如此(我知道不会因为myarray 实际上是一个引用而不是一个数组)。

【问题讨论】:

  • 第一个、第二个还是第三个?
  • 第三个,试试print $$myarray[1][1]

标签: arrays perl


【解决方案1】:

第一个和第二个示例在功能上是等效的。一个只是另一个的语法糖。

第三个在语义上是不同的。尽管在索引之间省略 -> 运算符是可以接受的,但如果变量(或子例程)包含(或返回)引用,则在标识符或子例程调用和索引之间这样做是不可接受的,因为 Perl 会将这些视为非在这种情况下参考。

没有任何情况$array->[1][2] 可以表示除$array->[1]->[2] 之外的任何内容,但是如果允许省略标识符和第一个索引之间的箭头,那么被索引到的结构是否看起来会是模棱两可的比如[1,...](1,...),它们是不同的东西。

【讨论】:

  • 注意$array->[1]->[2]@{ @{ $myarray }[0] }[0]是一样的
【解决方案2】:

三分

  1. $myarray 保存的是数组引用,而不是数组。
  2. $mayarray 和 @myarray 是不同的变量
  3. Perl 并没有真正做多维数组

所有引用都保存在标量中,因此所有引用都保存在以$ 开头的变量中。

[ ... ] 创建一个匿名数组引用,因此[ [1, 2, 3], [4, 5, 6], [7, 8, 9]] 创建一个匿名数组引用,其中包含 3 个匿名数组引用,每个引用包含 3 个标量。

这意味着对 $myarray 的赋值是在将外部匿名数组引用分配给它。

为了让两个访问引用指向两个的内容,您需要取消引用它。您可以通过将参考指向的类型的符号放在参考前面,例如@$myarray。所以$$myarray[0] 是引用$myarray 中保存的匿名数组的第一个元素,或者您可以使用间接语法$myarray->[0]

在您的示例中,$myarray->[0] 包含数组引用 [1,2,3] 因此可以以与给定 $myarray->[0]->[0] 相同的方式取消引用这表示取消引用 $myarray 并给我第一个元素,这是一个数组引用,然后取消引用并给我第一个元素。

这是你的第二个例子。

Perl 允许您将 ][ 之间的 -> 以及用于匿名哈希的 }{ 删除,作为语法糖。这给出了$myarray->[0][0],这是您的第一个示例。

您的第三个示例正在寻找@myarray 的第一个元素,它是与$myarray 不同的变量。如果您将use strict 放在脚本的顶部,Perl 会为您捕捉到这个错误。

这是个好主意

use strict;
use warnings;

作为任何 Perl 脚本或模块的前两行,因为它们会在您的程序中捕获大量错误且可能致命的错误。如果您正在调试程序,那么在use strict 下添加use diagnostics 会提供更详细的消息。

【讨论】:

  • 次要注意:虽然@$myarray 是您将其作为数组取消引用的方式,但要取消引用和访问一个元素将是$$myarray[0],这相当于箭头符号。与您使用@array$array[0] 的方式相同。
【解决方案3】:

$myarray->[1] 表示“使用存储在$myarray 中的数组引用查找数组中的索引 1”。

$myarray[1] 表示“在数组@myarray 中查找索引1”。

$myarray@myarray这两个变量完全没有联系。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多