Perl多维数组访问

zzwlnbp8  于 2022-12-23  发布在  Perl
关注(0)|答案(3)|浏览(153)

假设多维数组是这样的,

$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实际上是一个引用,而不是数组)。

byqmnocz

byqmnocz1#

第一个和第二个例子在功能上是等价的,一个只是另一个的句法糖。
第三种在语义上不同,虽然在索引之间省略->操作符是可以接受的,但如果变量(或子例程)包含(或返回)引用,则在标识符或子例程调用与索引之间这样做是不可接受的,因为在这种情况下Perl会将它们视为非引用。
不存在$array->[1][2]可以表示除$array->[1]->[2]之外的任何内容的情况,但是如果允许省略标识符和第一个索引之间的箭头,则关于被索引到的结构是否看起来像[1,...](1,...)将是不明确的,这是不同的事情。

u0njafvf

u0njafvf2#

三点

  1. $myarray保存的是数组引用,而不是数组。
  2. $myarray@myarray是不同的变量
  3. Perl实际上并不处理多维数组
    所有引用都保存在标量中,因此所有引用都保存在以$开头的变量中。
    [ ... ]创建了一个匿名数组引用,因此[ [1, 2, 3], [4, 5, 6], [7, 8, 9]]创建了一个包含3个匿名数组引用的匿名数组引用,每个匿名数组引用包含3个标量。
    这意味着对$myarray的赋值是将外部匿名数组引用赋给它。
    为了访问一个引用指向的东西,你需要解引用它,你可以把引用指向的类型的符号放在引用前面,比如@$myarray,所以$$myarray[0]是匿名数组的第一个元素,保存在引用$myarray中,或者你可以使用间接语法$myarray->[0] .
    在你的例子中,$myarray->[0]保存了数组引用,所以这可以用同样的方法解引用,给$myarray->[0]->[0],这就是解引用$myarray,给予我第一个元素,这是数组引用,然后解引用它,给我第一个元素。
    这是你的第二个例子。
    Perl允许你把->放在][之间,以及}{之间,作为语法上的糖衣,这是你的第一个例子$myarray->[0][0]
    第三个例子是查找@myarray的第一个元素,它是与$myarray不同的变量。如果您将use strict放在脚本的顶部,Perl将为您捕获此错误。
    这是个好主意
use strict;
use warnings;

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

nbnkbykc

nbnkbykc3#

$myarray->[1]表示“使用存储在$myarray中的数组引用在数组中查找索引1“。
$myarray[1]表示“在数组@myarray中查找索引1“。
两个变量$myarray@myarray根本没有联系。

相关问题