2013-04-15 3 views
3

Я новичок в Perl, но мне нужно было получить текст из какого-то ужасного файла HTML. В коде до сих пор, я попал в точку, я добыл все значения мне нужно (я проверил это работает с самосвалом данных):Массив массивов в Perl

Для каждого записи данных, т.е. ряд 2D-таблицы они называются:

$org, $gene_name, $number, $motif_num, $pos, $strand, $seq 

У меня есть много записей данных, и каждый из них будет строкой, с указанными выше значениями в качестве столбцов.

Чтобы сделать другие вещи с ними позже, я хочу создать структуру 2D-массива, поэтому я могу прокручивать каждую запись (строку) и выбирать нужные значения и т. Д.

Я думал, что лучший способ сделать это будет использовать петлю и для каждой записи данных, после извлечения значения с сопоставления с регулярным выражением, объединить значения/столбцов в массиве для отдельной записи данных:

my @seidl_array_row = ($org, $gene_name, $number, $motif_num, $pos, $strand, $seq); 

Затем нажмите на этот массив готового 2D массив массивов: (. @seidl_array был определен с my перед циклом)

push @seidl_array, [ @seidl_array_row ]; 

Таким образом, я получаю таблицу 2D-данных, где каждый элемент массива @seidl_array представляет собой массив, содержащий значения $ org, $ gene_name, $ number, $ motif_num, $ pos, $ strand и $ seq.

Я новичок в Perl, поэтому не знаю, был ли это правильный способ сделать это программно, так как у меня возникают проблемы, когда дело доходит до того, как делать это позже. Я задавался вопросом, была ли проблема в том, как я сконструировал массив массивов в первую очередь. Примеры в моей книге делают это статически с простыми наборами данных, и это гораздо больший геномный файл данных геномных данных, поэтому сделать это статически не реально.

+1

Какие проблемы у вас возникли позже?Для записи ваш 2-мерный массив выглядит нормально, а во-вторых, вам будет легче извлечь данные из HTML с помощью библиотеки, специфичной для HTML, а не только регулярных выражений –

ответ

6

Насколько я могу видеть, нет ничего неправильно с вашим подходом. Использование ссылки на массив вместо копирования массива, как предложил хороба, имеет то преимущество, что данные не копируются без необходимости (но помните: это работает, если вы объявляете @seidl_array_row внутри цикла, иначе вы просто сделали бы несколько ссылок на один и тот же массив).

Вы можете иметь то же преимущество, полностью пропуская массив строк, как так:

push @seidl_array, [ $org, $gene_name, $number, $motif_num, $pos, $strand, $seq ]; 

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

push @seidl_array, { 
    org => $org, 
    name => $gene_name, 
    number => $number, 
    motif => $motif_num, 
    pos => $pos, 
    strand => $strand, 
    seq => $seq, 
}; 

Это имеет то преимущество, что вам не нужно запоминать позиции соответствующих значений в массиве, но можете получить к ним доступ по имени.

+0

+1 для использования хешей вместо массивов. Это хорошая привычка. –

+0

Спасибо, я изменил свой код, так как он использует хэш. Поэтому, если я хочу перебрать все элементы и выполнить операции, это правильный способ сделать это, скажем, например, я хочу напечатать все переменные строки или иначе работать с ними 'while (my% seidl_row = shift @seidl_array) {print Dumper $ seidl_row {strand};} '? – Ward9250

+0

Я думаю, что я придумал цикл, подобный выше, который работает: 'for my $ i (0 .. $ # seidl_array) {print« Поиск местоположений мотивов на ген », $ seidl_array [$ i] {geneID} , "\ n";} ' – Ward9250

4

Ваше решение кажется правильным для меня. Использование [ @seidl_array_row ] создает копию списка, если вы правильно объявить строку с my внутри цикла, вы можете сохранить свою ссылку непосредственно, чтобы избежать ненужного копирования:

push @seidl_array, \@seidl_array_row; 
Смежные вопросы