Как уже говорили другие, вы можете попробовать базу данных. Другая возможность: использовать более сложную структуру данных.
Например, если ваша хеш-таблица указана по датам, каждая запись в хэше может быть ссылкой на массив идентификаторов.
Используя ваш пример:
$hash{1/1/2000} = [ 1, 2, 3];
$hash{1/2/2000} = [ 4, 5 ];
Таким образом, если вы найдете дату, вы можете быстро найти все идентификаторы на эту дату. Сортировка ключей позволит вам найти диапазон дат. Это особенно верно, если вы храните даты в более сортируемом формате. Например, в формате ГГГГММДД или в стандартном формате даты / времени Unix.
Например:
$hash{20000101} = [ 1, 2, 3];
$hash{20000102} = [ 4, 5];
Вы сказали, что есть несколько сотен дат, поэтому сортировка дат будет довольно быстрой.
Вы знакомы с такими вещами, как хэши массивов? Вы можете посмотреть документацию по Perl для очень короткого учебника Марка о ссылках и perldsc , который фактически показывает, как настроить хэши массивов.
Теперь ищем дату по идентификатору ...
Представьте себе более сложную структуру. Первый уровень будет иметь два элемента DATES
и IDS
. Затем часть IDS может быть ссылкой на хэш идентификаторов, а ключ DATES будет иметь ту же структуру, что и упомянутая выше. Вам придется синхронизировать эти две структуры, хотя ...
$dataHash->{DATES}->{20020101}->[0] = 1;
$dataHash->{DATES}->{20020101}->[2] = 2;
$dataHash->{DATES}->{20020101}->[3] = 3;
$dateHash->{IDS}->{1} = 20020101;
$dateHash->{IDS}->{2} = 20020101;
$dateHash->{IDS}->{3} = 20020101;
Хм ... Это становится сложным. Возможно, вам стоит взглянуть на учебник Perl по объектно-ориентированному программированию .
Снятие материала с головы без всякого тестирования:
package DataStruct;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
my $self->_Id;
my $self->_Date;
return $self;
}
sub _Id {
my $self = shift;
my $id = shift;
my $date = shift;
$self->{IDS} = {} if not exists $self->{IDS};
if (defined $id and defined $date) {
$self->{IDS}->{$id} = $date;
}
if (defined ($id) {
return $self->{IDS}->{$id};
else {
return keys %{self->{IDS}};
}
}
sub _Date {
my $self = shift;
my $date = shift;
my $id = shift;
$self->{DATES} = {} if not exists $self->{DATES};
if (defined $date and defined $id) {
$self->{DATES}->{$date} = [] if not defined $self->{DATES}->{$date};
push @{$self->{DATES}->{$date}}, $id;
};
if ($date) {
return @{$self->{DATES}->{$date}};
}
else {
return keys %{$self->{DATES};
}
}
sub Define {
my $self = shift;
my $id = shift;
my $date = shift;
$self->_Id($id, $date);
$self->_Date($date, $id);
return $self->_Date($date);
}
sub FetchId {
my $self = shift;
my $id = shift;
return $self->_Id($id);
}
sub FetchDate {
my $self = shift;
my $id = shift;
return $self->_Date;
}
В приведенном выше примере вы создаете исходную структуру данных с помощью:
my $struct = DataStruct->new;
Теперь, чтобы добавить дату и идентификатор, вы должны позвонить:
$struct->Define($id, $date);
Это, в свою очередь, вызовет $struct->_Id($id, $date);
и $struct->_Date($date, $Id);
. Поскольку они начинаются с подчеркивания, они private и могут быть вызваны только другими методами DataStruct. В основном вы используете $ struct-Set для ввода ваших данных.
Чтобы получить определенную дату (или весь диапазон дат), вы используете метод $dataStruct->FetchDate($date)
, а для получения определенного идентификатора вы используете $dataStruct->FetchId($id);
Теперь пакет DataStruct
будет использоваться для синхронизации и хеша идентификаторов, и хешей дат, чтобы исключить сложность основной части вашей программы.
Там есть все, что вам нужно! Все, что вам нужно сделать, это исправить мои многочисленные ошибки и, вероятно, иметь некоторую подпрограмму, которая преобразует дату в стиле M/D/Y
в дату в стиле YYYYMMDD
или в стандартную структуру внутреннего хранилища даты и времени. Таким образом, вам не нужно беспокоиться об исправлении даты перед вызовом этих подпрограмм. О, и вы, вероятно, тоже захотите какую-то обработку ошибок. Что если я дам вам неправильную дату или идентификационный номер?
Как уже говорили другие, вам лучше использовать структуру базы данных, даже если вы используете искусственную структуру базы данных, такую как SQLite.
Однако я хотел сообщить вам, что Perl на самом деле вполне способен создавать некоторые очень интегрированные структуры данных, которые могут помочь в подобных случаях.
Из того, как вы сформулировали свой вопрос, я предположил, что вы действительно не были знакомы с созданием этих сложных структур данных. Если нет, то в Perl есть несколько превосходных обучающих программ , встроенных в сам Perl. И команда perldoc
(которая устанавливается вместе с Perl) может вызвать всю документацию Perl. Попробуйте perldoc perlreftut
и посмотрите, не приводит ли он учебник Марка к ссылкам.
Как только вы начнете изучать более сложные структуры данных, вы научитесь использовать объектно-ориентированное программирование, чтобы упростить их обработку. Опять же, есть несколько отличных учебных пособий, встроенных прямо в Perl (или вы можете перейти на веб-страницу Perldoc ).
Если вы уже знали все это, я прошу прощения. Однако, по крайней мере, у вас есть основания для хранения и работы с вашими данными.