Инициализация массива хэшей в Perl - PullRequest
0 голосов
/ 27 февраля 2012

Я совершенно новичок в Perl и пишу скрипт на Perl. Часть моего скрипта подсчитывает, сколько раз каждое слово появляется в текстовом файле. ЭТО РАСЧЕТ повторяется после определенных интервалов, ТАК, ЧТО МНЕ НУЖЕН Массив для каждой повторяющейся последовательности . У меня есть код для подсчета количества слов, НО ДЛЯ ТОЛЬКО ОДНОЙ ПОСЛЕДОВАТЕЛЬНОСТИ .

for (@array) {
  $counts{$_}++;
  print "\'$_\'\t";
}

Моя проблема в том, что мне нужно создать массив для хеша "count".

РЕДАКТИРОВАТЬ: под ARRAY я имею в виду, что я должен быть в состоянии сохранить повторение для каждого слова для каждого конкретного раздела текстового файла. Мне просто нужно определить частичный счет для каждого раздела в текстовом файле. Вот как выглядит мой текстовый файл:!

Я загрузил изображение для подробного описания

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

Отличительной особенностью 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++;
}
1 голос
/ 27 февраля 2012

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

use strict;
use warnings;
use Data::Dumper;

my %count;
my $section;
while (<DATA>) {
    chomp;
    if (/^section/) {      # some check to tell sections apart
        $section = $_;
    } else {
        $count{$section}{$_}++;
    }
}

print Dumper \%count;      # see what your structure looks like
my @array = values %count; # if you don't like hashes

__DATA__
section1
param1
param2
param2
param3
section2
param1
param2
param3
param1
section3
param4
param1
param1
param2
section4
param1
param3
0 голосов
/ 27 февраля 2012

Создание анонимного хэша количества слов. В конце каждого раздела вставьте хеш в массив и начните новый анонимный хеш. Код ниже реализует это. (Вызов Data::Dumper предназначен только для демонстрации построенной структуры данных.)

use strict;
use warnings;

my $sect;
my @counts;

while (<DATA>) {
  if (/^(\w+)/) {
    $sect->{$1}++;
  }
  elsif ($sect) {
    push @counts, $sect;
    undef $sect;
  }
}

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
print Data::Dumper->Dump([\@counts], ['*counts']);


__DATA__
--------------------
>this is my first statement
Parameter1
Parameter2
Parameter3
Parameter2
--------------------
>this is my second statement
Parameter1
Parameter2
Parameter3
--------------------
>this is my third statement
Parameter1
Parameter2
Parameter2
Parameter3
--------------------
>this is my fourth statement
Parameter1
Parameter2
--------------------
>this is my fifth statement
Parameter1
Parameter2
Parameter3
Parameter4
--------------------

OUTPUT

@counts = (
  {
    'Parameter1' => 1,
    'Parameter2' => 2,
    'Parameter3' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 1,
    'Parameter3' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 2,
    'Parameter3' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 1,
    'Parameter3' => 1,
    'Parameter4' => 1
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...