NAME
Hash::Compact - A hash-based object implementation with key alias and default value support
SYNOPSIS
package
My::Memcached;
use
strict;
use
warnings;
use
JSON;
use
Hash::Compact;
my
$OPTIONS
= {
foo
=> {
alias_for
=>
'f'
,
},
bar
=> {
alias_for
=>
'b'
,
default
=>
'bar'
,
},
};
sub
get {
my
(
$self
,
$key
) =
@_
;
my
$value
=
$self
->SUPER::get(
$key
);
Hash::Compact->new(decode_json
$value
,
$OPTIONS
);
}
sub
set {
my
(
$self
,
$key
,
$value
,
$expire
) =
@_
;
my
$hash
= Hash::Compact->new(
$value
,
$OPTIONS
);
$self
->SUPER::set(
$key
, encode_json
$hash
->compact,
$expire
);
}
package
main;
use
strict;
use
warnings;
use
Test::More;
my
$key
=
'key'
;
my
$value
= {
foo
=>
'foo'
};
my
$memd
= My::Memcached->new({
servers
=> [
qw(localhost:11211)
]});
$memd
->set(
$key
,
$value
);
my
$cached_value
=
$memd
->get(
$key
);
is
$cached_value
->param(
'foo'
),
'foo'
;
is
$cached_value
->param(
'bar'
),
'bar'
;
is_deeply
$cached_value
->compact, +{
f
=>
'foo'
};
$cached_value
->param(
bar
=>
'baz'
);
$memd
->set(
$key
,
$cached_value
->compact);
$cached_value
=
$memd
->get(
$key
);
is
$cached_value
->param(
'foo'
),
'foo'
;
is
$cached_value
->param(
'bar'
),
'baz'
;
is_deeply
$cached_value
->compact, +{
f
=>
'foo'
,
b
=>
'baz'
};
done_testing;
DESCRIPTION
When we store some structured value into a column of a relational database or some key/value storage, redundancy of long key names can be a problem for storage space.
This module is yet another hash-based object implementation which aims to be aware of both space efficiency and easiness to use for us.
METHODS
new (\%hash [, \%options])
my
$hash
= Hash::Compact->new({
foo
=>
'foo'
,
}, {
foo
=> {
alias_for
=>
'f'
,
},
bar
=> {
alias_for
=>
'b'
,
default
=>
'bar'
,
},
},
);
Creates and returns a new Hash::Compact object. If \%options
not passed, Hash::Compact object $hash
will be just a plain hash-based object.
\%options
is a hash-ref which key/value pairs are associated with ones of \%hash
. It may contain the fields below:
alias_for
Alias to an actual key. If it's passed,
\%hash
will be compacted into another hash which has aliased key. The original key of\%hash
will be just an alias to an actual key.default
If this exists and the value associated with the key of
\%hash
is undefined, Hash::Compact object$hash
returns just the value. It's for space efficiency;$hash
doesn't need to have key/value pair when the value isn't defined or it's same as default value.
param ($key)
param (%pairs)
$hash
->param(
'foo'
);
#=> 'foo'
$hash
->param(
'bar'
);
#=> 'bar' (returns the default value)
$hash
->param(
bar
=>
'baz'
,
qux
=>
'quux'
,
);
$hash
->param(
'bar'
);
#=> 'baz'
Setter/getter method.
compact ()
my
$compact_hash_ref
=
$hash
->compact;
#=> { f => 'foo', b => 'baz' qux => 'quux' } (returns a compacted hash)
Returns a compacted hash according to \%options
passed into the constructor above;
to_hash ()
This method will be deprecated and removed at later version.
keys ()
@keys
=
$hash
->
keys
;
#=> (foo, bar, qux)
Returns the original key names. If default
option is set for a key, the key will be returned even if the value associated with the key is not set.
original ()
my
$original_hash_ref
=
$hash
->original;
#=> { foo => 'foo', bar => 'baz' qux => 'quux' } (returns an original hash)
Returns the original key-value pairs as HashRef, which includes key-value pairs if the key-values not set but default
option is designated.
AUTHOR
Kentaro Kuribayashi <kentarok@gmail.com>
SEE ALSO
LICENSE
Copyright (C) Kentaro Kuribayashi
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.