Perl: начинающийКакую структуру данных я должен использовать? - PullRequest
5 голосов
/ 10 июня 2011

Хорошо, не знаю, где это спросить, но я начинающий программист, использующий Perl. Мне нужно создать массив из массива, но я не уверен, что было бы лучше использовать ссылки на массив / хэш, или массив хэшей или хэш массивов и т. Д.

Мне нужен массив совпадений: @totalmatches

Каждое совпадение содержит 6 элементов (строк):

@matches = ($chapternumber, $sentencenumber, $sentence, $grammar_relation, $argument1, $argument2)

Мне нужно вставить каждый из этих элементов в массив @matches / хэш / ссылку, а затем вставить этот массив / ссылку / хэш в массив @totalmatches.

Соответствия найдены на основе поиска файла и выбора строк на основе соответствия критериям.

ВОПРОСЫ

  1. Какую структуру данных вы бы использовали?

  2. Можете ли вы вставить массив в другой массив, как если бы вы помещали элемент в массив? Это эффективный метод?

  3. Можете ли вы нажать все 6 элементов одновременно или сделать 6 отдельных нажатий?

  4. При работе с 2-мерным циклом вы бы использовали:

    foreach (@totalmatches) { foreach (@matches) { ... } }

Спасибо за любой совет.

Ответы [ 4 ]

6 голосов
/ 10 июня 2011

Какую структуру данных вы бы использовали?

Массив для упорядоченного набора вещей. Хеш для набора именованных вещей.

Можете ли вы вставить массив в другой массив, как если бы вы помещали элемент в массив? Это эффективный метод?

Если вы попытаетесь вставить массив (1) в массив (2), вы в конечном итоге поместите все элементы 1 в 2. Поэтому вместо этого вы должны добавить ссылку на массив.

Можете ли вы нажать все 6 элементов одновременно, или вам нужно сделать 6 отдельных нажатий?

Посмотрите на perldoc -f push

push ARRAY,LIST

Вы можете добавить список вещей в.

При работе с 2-D для циклического просмотра вы бы использовали:

Вложенный foreach - это хорошо, но этот синтаксис не сработает. Вы должны получить доступ к значениям, с которыми имеете дело.

for my $arrayref (@outer) {
    for my $item (@$arrayref) {
        $item ...
    }
}
3 голосов
/ 10 июня 2011

Не помещайте один массив в другой.Списки просто объединяются друг с другом в новый список.

Используйте список ссылок.

#create an anonymous hash ref for each match
$one_match_ref = {
     chapternumber => $chapternumber_value, 
     sentencenumber => $sentencenumber_value, 
     sentence => $sentence_value,
     grammar_relation => $grammar_relation_value, 
     arg1 => $argument1, 
     arg2 => $argument2
};

# add the reference of match into array.
push @all_matches, $one_match_ref;

# list of keys of interest
@keys = qw(chapternumber sentencenumber sentence grammer_relation arg1 arg2);
# walk through all the matches.
foreach $ref (@all_matches) {
    foreach $key (@keys) {
        $val = $$ref{$key};

    }
    # or pick up some specific keys
    my $arg1 = $$ref{arg1};
}
2 голосов
/ 10 июня 2011

Which data structure would you use?

Некоторые основные свойства контейнера:

  • Массив - это контейнер для упорядоченных скаляров.

  • Хеш - это контейнер для скаляров, полученных по уникальному ключу (в хеше не может быть повторяющихся ключей).Порядок значений, добавленных позже, больше недоступен.

Я бы использовал ту же структуру, что и предложенный ZhangChn.

Используйте хэш для каждого совпадения.Подробные сведения о совпадении могут быть доступны по описательным именам вместо простых числовых индексов.то есть $ref->{'chapternumber'} вместо $matches[0].

Возьмите ссылки на эти анонимные хэши (которые являются скалярами) и поместите их в массив, чтобы сохранить порядок совпадений.

Для разыменования элементов из структуры данных

  • получить элемент из массива, который является хеш-ссылкой

  • получить любую необходимую вам деталь из хеш-ссылки

2 голосов
/ 10 июня 2011

Какую структуру данных вы бы использовали?

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

Можете ли вы вставить массив в другой массив, как если бы вы помещали элемент в массив? Это эффективный метод?

Вот эта вещь; в Perl массивы могут содержать только скалярные переменные - те, которые начинаются с $. Что-то вроде ...

@matrix = ();
@row = ();
$arr[0] = @row; # FAIL!

... не будет работать. Вместо этого вам придется использовать ссылку на массив:

@matrix = ();
@row = ();
$arr[0] = \@row;

Или в равной степени:

push(@matrix, \@row);

Можете ли вы нажать все 6 элементов одновременно, или вам нужно сделать 6 отдельных нажатий?

Если вы используете ссылки, вам нужно только нажать один раз ... и поскольку вы не хотите объединять массивы (вам нужен массив массивов), вы застряли без альтернатив;)

При работе с 2-мерным циклом вы бы использовали:

Я бы использовал что-то вроде:

for($i=0; $i<@matrix; $i++) {
    @row = @{$matrix[$i]}; # de-reference
    for($j=0; $j<@row; $j++) {
        print "| "$row[$j];
    }
    print "|\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...