Arrays Perl多维数组访问

Arrays Perl多维数组访问,arrays,perl,Arrays,Perl,假设多维数组是这样的 $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 = [ [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
实际上是一个引用,而不是数组)。

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

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


在任何情况下,
$array->[1][2]
都不能表示除
$array->[1]->[2]
之外的任何内容,但如果允许省略标识符和第一个索引之间的箭头,则将不明确索引到的结构是类似于
[1,…]
还是
(1,…)
,这是不同的事情

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

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

两个变量
$myarray
@myarray
根本没有联系。

三个点

  • $myarray保存的是数组引用,而不是数组
  • $mayarray和@myarray是不同的变量
  • 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
    不同的变量。如果您将
    使用strict
    放在脚本的顶部,Perl会为您捕获此错误

    这是一个好主意

    use strict;
    use warnings;
    

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

    第一行、第二行还是第三行?对于第三行,请尝试
    打印$$myarray[1][1] 
    请注意,
    $array->[1]->[2]
    {$myarray}[0]}[0]
    注意:虽然
    @$myarray
    是将其作为数组取消引用的方式,但取消引用并访问一个元素将是
    $$myarray[0]
    ,相当于箭头符号。使用方法与使用
    @array
    $array[0]
    相同。