Отличительной особенностью Perl является то, что нет необходимости инициализировать хеш или массив, вы просто создаете его.
Вы говорите, что вы новый пользователь Perl, но, похоже, вы знаете о ссылках.Вы можете прочитать отличный учебник прямо в документации Perl .Вы можете сделать это, используя команду perldoc
из командной строки.
Тем не менее, глядя на ваше приложение, я вижу несколько различных типов структур данных:
- Массив хэшей : В этой структуре у вас будет массив для каждого раздела, который вы ударите, и вы будете нумеровать разделы от 0 до максимального значения, которое вы ударили.Вы сохраняете счет каждой записи в хэше для этой записи.
Код будет выглядеть примерно так:
my $section_number = -1; #We'll increment this to one on the first section number
my @data; #This is an array where you'll store your sections
while (my $line = <$my_file>) {
chomp $line;
if ($line =~ /^>this is my \w+ statement$/) {
$section_number++;
$data[$section_number] = {}; #A reference to a hash
}
else {
$data[$section_number]->{$line}++;
}
}
Первая часть оператора if просто увеличиваетсяколичество разделов, так что каждый параметр хранится в отдельном разделе.Это хорошо, если вопрос В разделе #x, сколько раз вы видели параметр "y"? .
- Хэш массивов :На этот раз вы отслеживаете параметр, а затем - раздел, в котором отображается этот параметр. Это обратное вышеописанному, но хорошо для ответа на вопрос Сколько раз параметр "y" появлялся в каждом разделе?
Код будет выглядеть примерно так:
my $section_number = -1; #We'll increment this to one on the first section number
my %data; #This is an array where you'll store your sections
while (my $line = <$my_file>) {
chomp $line;
if ($line =~ /^>this is my \w+ statement$/) {
$section_number++;
}
else {
if (not exists $data{$line}) {
$data{$line} = []; #This hash will contain a ref to an array
}
$data{$line}->[$section_number]++;
}
}
Другая возможность состоит в использовании Хеша хешей , TLP показано.
Дело в том, что когда вы говорите о структуре, которая содержит больше, чем просто скалярные данные, вам нужно использовать ссылки.
Как вы хотите построить свою структуру данных, зависит от вас и зависит от того, что вы хотите отслеживать и как вы хотите получить доступ к этим данным.Как показано в этом одном вопросе, существует как минимум три различных способа структурирования данных.И построить эту сложную структуру данных довольно легко.И действительно, инициализировать нечего.
Как только вы поймете ссылки, ваша структура данных может быть настолько сложной, насколько вы осмеливаетесь (хотя я предлагаю начать изучать объектно-ориентированные методы кодирования Perl, прежде чем вы начнете сходить с ума от них).
Кстати, ни в одном из ответов не упоминалось, как вы будете обращаться к вашим данным, кроме использования Data :: Dumper , но простого цикла будет достаточно.Это для массива хэшей:
my $section = 0;
while ($section <= $#data) {
my %param_hash = %{$data[$section]};
foreach my $parameter (sort keys %param_hash) {
print "In section $section: $parameter appears $param_hash{$parameter} times\n";
}
$section++;
}