regatta am Freitag, 3. März 2006 21.29:
> Good morning/evening everyone,
>
> I have a hash of data , this hash is very big with dynamic elements
> (strings, numbers, hashes, arrays)
>
> Here is an example
>
> $info{'system'}{'load'}{'1'}
> $info{'system'}{'load'}{'5'}
> $info{'system'}{'load'}{'15'}
> $info{'system'}{'hostid'}
> $info{'system'}{'time'}
> $info{'system'}{'hostname'}
> $info{'system'}{'network'}{'eth0'}{'ip'}
> $info{'system'}{'network'}{'eth1'}{'ip'}
> $info{'system'}{'mount'}{'/'} ==> array (/dev/sda1, 100, 10%, 4220)
>
>
> The size and the data may get changed, so is there any function that
> can help me to print all the %info data to be like this :
>
> system.load.1
> system.load.2
> ..
> ..
> system.hostname
> system.network.eth0.ip
> ...
> system.mount././dev/sda1
> system.mount./.100
> system.mount./.10%
> ....
>
> I can't think about a way to do that
Hi Regatta,
Below is a possible way to do it. I'm sure there are modules on cpan.org
dealing with the problem of building the path of all leaf nodes of a tree.
You have to adapt the script if you also want the values printed out.
hth,
Hans
#!/usr/bin/perl
use strict;
use warnings;
# any nested data structure of hashes, arrays, scalars
#
my %data=(a=>{bb=>1, cc=>[2,3,4,5]}, b=>5, c=>{x=>6, y=>{v=>7,w=>8}});
# recursive sub to build path
#
sub dotted_notation {
my ($item, $str)[EMAIL PROTECTED];
if (my $ref=ref($item)) {
# $item contains nested non-scalar data
#
if ($ref eq 'ARRAY') {
_recursive($item->[$_], $str.($str ? '.' : '').$_)
for @$item;
}
elsif ($ref eq 'HASH') {
_recursive($item->{$_}, $str.($str ? '.' : '').$_)
for keys %$item;
}
else { warn "'$ref' not supported";}
}
else {
# leaf reached, print out accumulated path
#
print "$str\n";
}
}
dotted_notation(\%data);
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>