You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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";

错误点修正说明

  1. 错误的行数组初始化
    原代码中my @list = [];的问题:[]会创建一个空数组的引用(标量),赋值给@list后,@list的第一个元素就是这个引用,后续push元素会让@list变成(ARRAY(0x...), 元素1, 元素2...)的混合结构。正确做法是my @temp_row;创建空的普通数组。

  2. 错误的推入矩阵方式
    原代码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:37:05