为何无法按预期引用Perl数组中的子数组元素?
问题:Perl遍历数组的数组时$elem[0]未定义的原因
用户尝试用以下代码遍历数组的数组:
foreach my $elem ( @{ $mastermap } ) { say $elem; say $elem[0]; say Dumper($elem); }
(目前仅为调试输出,并非实际要对数组数据执行的操作。)
每次循环迭代的输出如下:
ARRAY(0x55dabc740cc0) Use of uninitialized value in say at test.pl line 39. $VAR1 = [ 'bob', '*', '1492', '1492', 'machine acct', '/var/bob', '/bin/false' ];
可见$elem是一个数组引用(用户也曾错误地将其当作哈希处理),Dumper可以输出该数组的内容,但$elem[0]却显示未定义。用户想知道对Perl数组存在哪些误解。
补充说明:$mastermap是通过Text::CSV读取类似/etc/passwd的文件得到的数组的数组,读取代码如下:
my $mastermap = csv ({ in => $passwd, sep_char => ":", quote_char => "#" });
其中$passwd大致是/etc/passwd的副本。
解答
- 你混淆了数组引用和数组变量的核心区别:
- 循环中的
$elem是数组引用(输出里的ARRAY(0x55dabc740cc0)就是引用的特征标识),它是指向子数组的指针,而非数组本身。 $elem[0]是在访问名为@elem的普通数组的第一个元素,但你从未定义过@elem,所以会触发未初始化的错误。
- 循环中的
- 要访问
$elem指向的子数组元素,必须使用解引用语法,常用两种写法:- 完整解引用:
${$elem}[0] - 简洁箭头写法:
$elem->[0](Perl社区更推荐这种)
- 完整解引用:
修改后的调试代码示例:
foreach my $elem ( @{ $mastermap } ) { say $elem; say $elem->[0]; # 正确访问子数组的第一个元素 say Dumper($elem); }
- 额外说明:你对
$mastermap的解引用@{ $mastermap }是正确的,它把顶层数组引用展开成了一个个子数组引用,这部分逻辑没问题。
内容的提问来源于stack exchange,提问作者Ray Shaw
相关产品推荐
相关产品推荐

