(
['metadata_cache_mgmt', 'max_open_databases', 'count', value],
['cache_mgmt', 'spinlock_contention', 'per_sec', value]
)
####
#!/usr/bin/perl
use warnings;
use strict;
# takes ref to zero-or-more levels deep nested hash structure
# returns list of array refs for each leaf containing, top down, the keys
# to reach the node followed by the leaf value
sub leaves {
my $node = shift;
if (ref $node eq 'HASH') {
my @leaves;
for my $key (keys %$node) {
push @leaves, map [$key, @$_], leaves($node->{$key});
}
@leaves;
} else {
[$node];
}
}
# takes ref to nested hash structure and list of top-down keys to traverse
# returns reference to to desired node
sub find_node_ref {
my $noderef = \$_[0];
shift;
$noderef = \($$noderef->{$_}) for @_;
$noderef;
}
our @in;
our $out;
$in[0]{foo}{bar}{baz} = 'bag';
$in[0]{foo}{fuw} = 'fu';
$in[1]{foo}{gar} = 'weeble';
$in[2]{foo}{bar}{baz} = 'bog';
for (my $idx = 0; $idx < @in; ++$idx) {
next if not defined $in[$idx];
for my $leaf (leaves($in[$idx])) {
my $value = pop @$leaf;
my $node = find_node_ref($out, @$leaf);
$$node = [] unless defined $$node;
$$node->[$idx] = $value;
}
}
use Data::Dumper;
print Dumper \@in;
print Dumper $out;
####
$sysmon_data[0]->{cache_mgmt} = 0;
$sysmon_data[0]->{cache_mgmt}{spinlock_contention} = 'foo';