Since one of Perl's greatest strengths is working with text, a genuine concern is how to store data. Flat files are one possibility, but don't scale very well, to say the least. Instead, you'll need to use a database.
There are two general solutions to using databases with Perl. For simple database purposes, DBM (Database Management) will serve your needs. DBM is a library supported by many (if not all) Unix systems and many non-Unix systems as well. If you use DBM with Perl, you can manipulate databases just like any hash.
For more elaborate databases with SQL interfaces, you can get a complete database product or shareware equivalent (depending on your needs) and use DBI and DBD. DBI is a module that provides a consistent interface for database solutions. A DBD is a database-specific driver that translates DBI calls as needed for that database.
In this chapter, we'll quickly cover DBM and then talk more at length about DBI/DBD.
DBM is a simple database management facility for Unix systems. It allows programs to store a collection of key-value pairs in binary form, thus providing rudimentary database support for Perl. Practically all Unix systems support DBM, and for those that don't, you can get Berkeley DB from http://www.sleepycat.com/db.
To use DBM databases in Perl, you can associate
a hash with a DBM database through a process similar to
opening a file. This hash (called a DBM array) is
then used to access and modify
the DBM database.
To associate a DBM database with a DBM array, you can use either the
dbmopen
function or the
tie
function with a DBM-style
module. (dbmopen
is actually just a front-end to tie
.)
For example, with dbmopen
:
or (usingdbmopen(%ARRAYNAME, "dbmfilename", $mode);
tie
with the DB_File module):
Theuse DB_File; tie(%ARRAYNAME, "DB_File", "dbmfilename");
%ARRAYNAME
parameter is a Perl hash. (If it already has values, the
values are discarded.) This hash becomes connected to the DBM database called
dbmfilename
. This database
may be stored on
disk as a single file, or as two files called dbmfilename.dir and
dbmfilename.pag, depending on the DBM implementation.The $mode
parameter is a number that controls the permissions of
the pair of files if the files need to be created. The number is
typically specified in octal.
If the files already exist, this parameter
has no effect. For example:
This invocation associates the hashdbmopen(%BOOKS, "bookdb", 0666); # open %BOOKS onto bookdb
%BOOKS
with the disk files bookdb.dir and
bookdb.pag in the current directory. If the files don't already exist, they are
created with a mode of 0666, modified by the current umask.The return value from dbmopen
is true if the database could be opened or
created, and false otherwise, just like the open
function. If you don't want the
files created, use a $mode
value of undef
.
Once the database is opened, anything you do to the DBM hash is immediately written to the database. See Chapter 4, The Perl Language, for more information on hashes.
The DBM array stays open throughout the program. When the program termi- nates, the association is terminated. You can also break the association in a manner similar to closing a filehandle, by using thedbmopen(%BOOKS, "bookdb", 0666) || die "Can't open database bookdb!"; $BOOKS{"1-56592-286-7"} = "Perl in a Nutshell";
dbmclose
function (or untie
if you used
tie
). See Chapter 5, Function Reference, for more information on dbmclose
,
dbmopen
, and tie
.