tjw*_*992 1 database perl hash operator-overloading
我正在尝试使用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;
每次从哈希读取数据时,我都希望它调用一个函数来查询数据库并获取值.
每次将数据写入散列时,我都希望它调用一个函数将数据写入数据库.
这是我到目前为止:
Database.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变量的行为,以便访问变量可以执行标准变量无法执行的操作.
在答案中解释起来有点难,但perltie文档非常清楚.
基本上,您定义自己的包(可以称为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文件(实际上是用于存储持久性哈希的二进制文件)的绑定哈希支持.
| 归档时间: | 
 | 
| 查看次数: | 65 次 | 
| 最近记录: |