正如其他人所说,您可能想尝试使用数据库。另一种可能性:使用更复杂的数据结构。
例如,如果您的哈希表是按日期排列的,那么您可以将哈希中的每个条目作为一个 reference 到一个 id 数组。
用你的例子:
$hash{1/1/2000} = [ 1, 2, 3];
$hash{1/2/2000} = [ 4, 5 ];
这样,如果您找到一个日期,您可以快速找到该日期的所有 ID。对键进行排序将允许您找到一系列日期。如果您以更可排序的格式存储日期,则尤其如此。例如,YYYYMMDD 格式或标准 Unix 日期/时间格式。
例如:
$hash{20000101} = [ 1, 2, 3];
$hash{20000102} = [ 4, 5];
你说有几百个日期,所以排序你的日期会很快。
您熟悉数组哈希之类的东西吗?您可以查看 Mark's very short tutorial about references 和 perldsc 的 Perl 文档,它实际上向您展示了如何设置数组的哈希值。
现在,通过 id 查找日期...
想象一个更复杂的结构。第一级将有两个元素DATES 和IDS。然后,您可以让 IDS 部分成为对 ID 散列的引用,并且 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;
嗯...这越来越复杂了。也许你应该看看object oriented programming 上的 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;
现在,要添加日期和 ID,您可以调用:
$struct->Define($id, $date);
这将依次调用$struct->_Id($id, $date); 和$struct->_Date($date, $Id);。由于这些以下划线开头,它们是 private 并且只能由其他 DataStruct 方法调用。你主要使用 $struct-Set 来放你的数据。
要获取特定日期(或整个日期范围),请使用 $dataStruct->FetchDate($date) 方法,要获取特定 ID,请使用 $dataStruct->FetchId($id);
现在,DataStruct 包将用于保持 ID 哈希和日期哈希彼此同步,并将复杂性排除在程序的主要部分之外。
这里有你需要的一切!您所要做的就是修复我的许多错误,并且可能有一些例程将M/D/Y 样式日期转换为YYYYMMDDstyle 日期或转换为标准日期/时间内部存储结构。这样,您不必担心在调用这些例程之前确定日期。哦,您可能还需要某种错误处理。如果我给你一个错误的日期或身份证号码怎么办?
正如其他人所说,即使您使用 SQLite 之类的人造数据库结构,也最好使用数据库结构。
但是,我想让您知道 Perl 实际上非常有能力创建一些非常集成的数据结构,这些数据结构可以在这种情况下提供帮助。
根据您提出问题的方式,我假设您确实不熟悉创建这些复杂的数据结构。如果没有,Perl 本身就内置了一些出色的tutorials。而且,命令perldoc(与 Perl 一起安装)可以提取所有 Perl 文档。试试perldoc perlreftut,看看它是否能调出 Mark 的参考教程。
一旦您开始接触更复杂的数据结构,您将学会使用面向对象编程来简化它们的处理。同样,在 Perl 中内置了一些优秀的教程(或者你可以去Perldoc webpage)。
如果您已经知道这一切,我深表歉意。但是,至少您有存储和使用数据的基础。