如何在Perl中通过用户输入构建二维数组?
Perl中通过输入创建二维数组的正确实现
核心问题分析
你的代码出现ARRAY(0xddb038)标识和未初始化值错误,本质是混淆了Perl中普通数组和数组引用的用法:Perl的二维数组是「数组引用的集合」,外层数组的每个元素必须是一个行数组的引用,而非直接放入普通数组。
正确实现代码
print "enter number of rows: "; chomp(my $row = <>); print "enter number of columns: "; chomp(my $column = <>); my @matrix; for (my $r = 0; $r < $row; $r++) { my @temp_row; # 创建空普通数组存储当前行元素 for (my $c = 0; $c < $column; $c++) { print "input element [$r][$c]: "; chomp(my $input = <>); push @temp_row, $input; } push @matrix, \@temp_row; # 将当前行的数组引用推入matrix } # 打印整个矩阵 print "\nFinal matrix:\n"; foreach my $row_ref (@matrix) { print join("\t", @$row_ref), "\n"; } # 访问指定元素 print "\nmatrix[0][0] = ", $matrix[0][0], "\n";
错误点修正说明
错误的行数组初始化
原代码中my @list = [];的问题:[]会创建一个空数组的引用(标量),赋值给@list后,@list的第一个元素就是这个引用,后续push元素会让@list变成(ARRAY(0x...), 元素1, 元素2...)的混合结构。正确做法是my @temp_row;创建空的普通数组。错误的推入矩阵方式
原代码push(@matrix, @list);会把@list的所有元素(包括多余的数组引用)展开后推入@matrix,导致@matrix变成一维数组。正确做法是用\@temp_row获取数组的引用,将引用推入@matrix,这样@matrix的每个元素都是行数组的引用,才能通过$matrix[$r][$c]访问二维元素。
Perl二维数组基础补充
@前缀表示普通数组,$前缀表示标量(包括数组引用、哈希引用)[]创建匿名数组,返回数组引用;()创建普通数组$matrix[$r][$c]是${ $matrix[$r] }[$c]的简写:先取外层数组的第r个元素(行数组引用),再取该引用指向数组的第c个元素。
内容的提问来源于stack exchange,提问作者Prongs 713
相关产品推荐
相关产品推荐

