如何在Perl中创建2D数组?

JoT*_*JoT 11 arrays perl perl-data-structures

我试图在Perl中创建一个2d数组

我的代码:

my @wordsList=();
my @words=();

for ($id=0; $id<=@language.length; $id++)
{

        my $eng = $db->selectall_arrayref("select word from words 
                                                    left outer join language
                                                    on words.languageId = language.languageId
                                                    where words.languageId = $id
                                                    ;");


        foreach $eng(@$eng)
        {   
        my($word) = @$eng;
        $ref_to_Array->[$id][$word] = @words($id,$word);

            }
                return $words($id, $word);
}

$wordsList= NextWords();
print $wordsList;
Run Code Online (Sandbox Code Playgroud)

它返回非...因为我想返回2d数组.

更新

我仍然感到困惑,因为当我执行查询时,它给了我一个单词列表,如:

select word from words where language_id = 1 
(1=english, 2 - chinese, 3 - french) 
Run Code Online (Sandbox Code Playgroud)

我正在使用for循环语言,以便从数据库中获取所有单词

问题是我想循环并希望数组自动添加到2d数组.

Eri*_*rom 29

use warnings; use strict;在每次你写程序的顶部.这两个pragma将为你捕获许多错误.

您无法使用(...)后缀访问数组.该构造用于调用函数mysub(...)$mysubref->(...).要访问数组元素,请使用后缀[ index ].在Perl中,多维数组需要一对[...]每个级别.这是因为2D数组只是一个数组,其中每个元素也是一个数组.

my @array = ([1, 2, 3], [4, 5, 6], [7, 8, 9]);

my $top_left     = $array[0][0];  # 1
my $bottom_right = $array[2][2];  # 9

print "@$_\n" for @array;
Run Code Online (Sandbox Code Playgroud)
1 2 3
4 5 6
7 8 9

您可以在perldoc.perl.org上了解有关Perl数据结构和Perl其余部分的更多信息.以下是一些直接链接:

最后,@language.length不会做你认为它做的事情.它采用@language标量上下文,它的长度为数字,然后将其连接起来length($_).结果表达式就像(scalar @language) . length($_).由于<=运算符在其参数上强加了标量上下文,因此您可以简单地编写$id <= @language.但是,Perl为您提供了一种更自然的方式来编写这种类型的循环:

for my $id (0 .. @language) {...}
Run Code Online (Sandbox Code Playgroud)

要么

for my $id (0 .. $#language) {...}
如果你真的想要,$id < @language因为$language[scalar @language]是一个元素超过数组的结尾.