重载对数据库的读/写哈希访问



我正在尝试使用Perl实现一个非常简单的语法来读取和写入数据库。基本上,最终目标是能够访问数据库中的字段,就好像它们是一个简单的Perl散列一样。

不幸的是,我试图访问的数据库类型及其API是专有的,因此我无法详细了解如何实际读取和写入数据,只需假设数据库名称足以连接。需要在Perl中完成的工作是非常通用的,因此API信息不应该是相关的

首先,我正在创建一个简单的数据库对象:

my $database = Database->new('NAME');

然后我想从数据库中读取一个我想读取的字段名:

# Read from the database
my $value = $database{'field_name'};
# Write to the database
$database{'field_name'} = $value;

每次从哈希中读取数据时,我都希望它调用一个函数来查询数据库并获取值。

每次将数据写入哈希时,我都希望它调用一个函数将数据写入数据库。


这就是我目前所拥有的:

数据库.pm

package Database;
use overload '%{}' => &access_data;
sub new {
my $class = shift;
my $name  = shift;
my $self = bless {
name => $name
}, $class;
return $self;
}
sub access_data {
my $self  = shift;
my $field = shift;
my $data  = shift;
if (defined $data) {
# Write data to the database using the database API
}
else {
# Read data from the database using the database API
}
# Not sure what to return to make this work
}

test.pl

use Database;
my $database = Database->new('TESTDB');
# Overloaded to read the actual value from the database
print $database{'field_name'};

我一直在文档中搜索重载散列访问,但我很难确切理解它是如何工作的。

我如何才能让这种过载以我想要的方式工作?

您不希望看到重载,而是希望看到绑定变量。使用绑定变量,您可以更改标准Perl变量的行为,以便访问该变量可以做标准变量不能做的事情。

答案有点难以解释,但最终的文档非常清楚。

基本上,您可以定义自己的包(可以称之为Tie::Hash::Database)。然后,您需要为要更改的任何操作定义一个TIEHASH()方法(相当于构造函数)和方法(称为FETCH())。在伪代码中(因为我不知道你的数据库是如何工作的),它可能看起来有点像这样:

package Tie::Hash::Database;
use strict;
use warnings;
use Database;
sub TIEHASH {
my $class = shift;
my ($db_name) = @_;
my $self = {
db => Database->new($db_name);
};
return bless $self, $class;
}
# Store value in the hash
sub STORE {
my $self = shift;
my ($key, $val) = @_;
# code to store the key/value pair in the database;
$self->{db}->store($key, $value);
}
# Get value from hash
sub FETCH {
my $self = shift;
my ($key) = @_;
# code to get value from the database
return $self->{db}->get($key);
}
# ... etc ...

你会这样使用它:

use Tie::Hash::Database;
my %db_hash;
tie %db_hash, 'Tie::Hash::Database', 'name_of_database';
$db_hash{some_key} = 'some value';
print $db_hash{some_key};

多年前,我写了一篇文章,更详细地解释了这一切。你可能会发现它很有用。

更新:还值得指出的是,标准Perl发行版附带了对各种DBM文件(实际上是用于存储持久散列的二进制文件)的绑定散列支持。

最新更新