perldbmfilter (1)
Leading comments
Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) Standard preamble: ========================================================================
NAME
perldbmfilter - Perl DBM FiltersSYNOPSIS
$db = tie %hash, 'DBM', ... $old_filter = $db->filter_store_key ( sub { ... } ); $old_filter = $db->filter_store_value( sub { ... } ); $old_filter = $db->filter_fetch_key ( sub { ... } ); $old_filter = $db->filter_fetch_value( sub { ... } );
DESCRIPTION
The four "filter_*" methods shown above are available in all theEach of the methods works identically, and is used to install (or uninstall) a single
To summarise:
- filter_store_key
-
If a filter has been installed with this method, it will be invoked
every time you write a key to a DBMdatabase.
- filter_store_value
-
If a filter has been installed with this method, it will be invoked
every time you write a value to a DBMdatabase.
- filter_fetch_key
-
If a filter has been installed with this method, it will be invoked
every time you read a key from a DBMdatabase.
- filter_fetch_value
-
If a filter has been installed with this method, it will be invoked
every time you read a value from a DBMdatabase.
You can use any combination of the methods from none to all four.
All filter methods return the existing filter, if present, or "undef" if not.
To delete a filter pass "undef" to it.
The Filter
When each filter is called by Perl, a local copy of $_ will contain the key or value to be filtered. Filtering is achieved by modifying the contents of $_. The return code from the filter is ignored.An Example: the NULL termination problem.
For example, consider the following scenario. You have a
$hash{"$key\0"} = "$value\0";
Similarly the
It would be much better if you could ignore the
use strict; use warnings; use SDBM_File; use Fcntl; my %hash; my $filename = "filt"; unlink $filename; my $db = tie(%hash, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0640) or die "Cannot open $filename: $!\n"; # Install DBM Filters $db->filter_fetch_key ( sub { s/\0$// } ); $db->filter_store_key ( sub { $_ .= "\0" } ); $db->filter_fetch_value( sub { no warnings 'uninitialized'; s/\0$// } ); $db->filter_store_value( sub { $_ .= "\0" } ); $hash{"abc"} = "def"; my $a = $hash{"ABC"}; # ... undef $db; untie %hash;
The code above uses SDBM_File, but it will work with any of the
Hopefully the contents of each of the filters should be self-explanatory. Both ``fetch'' filters remove the terminating
Another Example: Key is a C int.
Here is another real-life example. By default, whenever Perl writes to a
$hash{12345} = "something";
the key 12345 will get stored in the
Here is a
use strict; use warnings; use DB_File; my %hash; my $filename = "filt"; unlink $filename; my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH or die "Cannot open $filename: $!\n"; $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ); $db->filter_store_key ( sub { $_ = pack ("i", $_) } ); $hash{123} = "def"; # ... undef $db; untie %hash;
The code above uses DB_File, but again it will work with any of the
This time only two filters have been used; we only need to manipulate the contents of the key, so it wasn't necessary to install any value filters.