NAME
Tie::Multidim - "tie"-like multidimensional data structures
SYNOPSIS
DESCRIPTION
This module implements multi-dimensional data structures on a hash. $foo->[2]{'die'}[4]
gets "mapped" to $bar{"2;die;4"}
, where the ';' is actually $SUBSEP ($;), and %bar is a hash you provide.
It is particularly useful in two, not disjoint, situations:
- 1. the data space (matrix, if you prefer) is sparsely populated;
- 2. the hash into which the data is mapped is tied.
This illustrates (1):
my
%matrix
;
# hash to store the data in.
local
$; =
' '
;
my
$foo
= new Tie::Multidim \
%matrix
,
'@@'
;
# array-of-arrays.
$foo
->[5432][9876];
# prints the value of $matrix{"5432 9876"}.
This illustrates (2):
my
%matrix
;
tie
%matrix
,
'Matrix'
;
# some hashtie-able class.
local
$; =
";"
;
# gets remembered by the object.
my
$foo
= new Tie::Multidim \
%matrix
,
'%@%'
;
# 3-level structure: hash of arrays of hashes.
$foo
->{
'human'
}[666]{
'beast'
} =
"value"
;
# causes a call to
sub
Matrix::STORE {
my
(
$self
,
$index
,
$value
) =
@_
;
my
(
$x
,
$y
,
$z
) =
split
$;,
$index
;
# with $x = 'human', $y = 666, and $z = 'beast'.
}
METHODS
new
This is the constructor.
The first argument is a hash-reference. This hash will be used by the Tie::Multidim object to actually store the data. The reference can be to an anonymous hash, to a normal hash, or to a tied hash. Tie::Multidim doesn't care, as long as it supports the normal hash get and set operations (STORE and FETCH methods, in TIEHASH terminology).
The second argument is a string containing '@' and '%' characters (a al function prototypes). The multidimensional data structure will be constructed to have as many dimensions as there are characters in this string; and each dimension will be of the type indicated by the character. '@%' is an array of hashes; '%@' is a hash of arrays; and so on.
storage
This returns the same hash reference that was passed as the first argument to the constructor. Not exactly a method, it must be called as a package function, and passed the multidim reference.
$foo
= new Tie::Multidim, \
%h
,
'@@'
;
$hashref
= Tie::Multidim::storage(
$foo
);
# same effect as:
$hashref
= \
%h
;
AUTHOR
jdporter@min.net (John Porter)
COPYRIGHT
This module is free software; you may redistribute it and/or modify it under the same terms as Perl itself.