Как мне создать 2D массив в Perl? - PullRequest
10 голосов
/ 17 февраля 2011

Я пытаюсь создать 2d массив в Perl

мой код:

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;

он возвращает не .. потому что я хочу вернуть массив 2d.

Обновление

Я все еще в замешательстве, потому что, когда я выполняю запрос, он дает мне список слов вроде:

select word from words where language_id = 1 
(1=english, 2 - chinese, 3 - french) 

Я использую цикл for для языка и для того, чтобы получить все слова из базы данных

Проблема в том, что я хочу выполнить цикл и хочу, чтобы массив автоматически добавлялся в 2d массив.

1 Ответ

28 голосов
/ 17 февраля 2011

Поместите use warnings; use strict; в начало каждой написанной вами программы.Эти две прагмы поймают за вас много ошибок.

Вы не можете получить доступ к массиву с постфиксом (...).Эта конструкция используется для вызова функций 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;
1 2 3
4 5 6
7 8 9

Подробнее о структурах данных Perl и остальной части Perl можно узнать по адресу perldoc.perl.org .Вот несколько прямых ссылок:

Наконец, @language.length не делает то, что вы думаете, что он делает.Он принимает @language в скалярном контексте, то есть его длину как число, а затем объединяет его с length($_).Полученное выражение выглядит как (scalar @language) . length($_).Поскольку оператор <= налагает скалярный контекст на его аргументы, вы можете просто написать $id <= @language.Тем не менее, Perl предоставляет вам более естественный способ написания цикла такого типа:

for my $id (0 .. @language) {...}

или

for my $id (0 .. $#language) {...}
, если вы действительно имели в виду $id < @language, поскольку $language[scalar @language] - это один элементза концом массива.
...