This gets around the package variable issue
package Data::Hash::Flatten;
use Storable qw(dclone);
sub this {
my @args = ([], @_[1 .. $#_]);
Data::Hash::Flatten->_flatten(@args);
}
sub _flatten {
my (undef, $flattened, $href, $field, $depth, $flat_rec ) = @_;
@$flattened = () unless defined($depth);
if ( ref $href ) {
my @key = keys %$href;
for my $key_i ( 0 .. $#key ) {
my $key = $key[$key_i];
$flat_rec->{ $field->[$depth] } = $key;
Data::Hash::Flatten->_flatten($flattened, $href->{$key},
$field, $depth + 1, $flat_rec);
}
} else {
$flat_rec->{ hits } = $href;
my $new_rec = dclone $flat_rec;
push @$flattened, $new_rec;
}
@$flattened;
}
package main;
use Data::Dumper;
my $a = {
bill => { '5/27/96' => { 'a.dat' => 1, 'b.txt' => 2,
'c.lsp' => 3 } },
jimm => { '6/22/98' => { 'x.prl' => 9, 'y.pyt' => 8,
'z.tcl' => 7 } }
};
my @a = Data::Hash::Flatten->this( $a, [qw(name date file)] );
print Dumper( \@a );
Hackish, but effective. Perhaps a better way around this is to re-write it as a class with methods and properties as opposed as to a function tucked away in it's own package.
HTH
_________
broquaint
update: changed code in this to suck less (wasn't passing the correct args)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.