package PathLister;
use Data::Dumper;
use strict;
use warnings;
sub new {
my $self = {};
bless($self);
return $self;
}
sub list {
my ($self, $data) = @_;
my $pathes = {};
my $path = "";
list_slave($data, $path, $pathes);
return $pathes;
}
sub list_slave {
my ($data, $path, $pathes) = @_;
if (ref($data) eq "HASH") {
foreach my $key (keys(%$data)) {
my $new_path = $path . '->{' . $key . '}';
if (ref($data->{$key})) {
$pathes->{$new_path} = $data->{$key};
list_slave($data->{$key}, $new_path, $pathes);
} else {
$pathes->{$new_path} = \$data->{$key};
}
}
} elsif (ref($data) eq "ARRAY") {
foreach my $index (0 .. $#{@$data}) {
my $new_path = $path . '->[' . $index . ']';
if (ref($data->[$index])) {
$pathes->{$new_path} = $data->[$index];
list_slave($data->[$index], $new_path, $pathes);
} else {
$pathes->{$new_path} = \$data->[$index];
}
}
}
}
1;
####
use Data::Dumper;
use PathLister;
use strict;
use warnings;
my $data = {
"a" => {
"b" => {
"c"=> 100,
"e"=> 101
},
"k" => {}
},
"b" => {
"c" => 3,
"d" => 4
},
"c" => [1,2,3,4,5]
};
my $lister = new PathLister;
print Dumper($data);
my $pathes = $lister->list($data);
foreach my $key (keys(%$pathes)) {
print "key = $key\n";
print Dumper($pathes->{$key});
}
${$pathes->{'->{a}->{b}->{c}'}} = 200;
${$pathes->{'->{c}->[2]'}} = 10;
my $hash_ref = $pathes->{'->{b}'};
$hash_ref->{"c"} = 3000;
print Dumper($data);
####
$VAR1 = {
'c' => [
1,
2,
3,
4,
5
],
'a' => {
'k' => {},
'b' => {
'e' => 101,
'c' => 100
}
},
'b' => {
'c' => 3,
'd' => 4
}
};
key = ->{c}->[0]
$VAR1 = \1;
key = ->{c}
$VAR1 = [
1,
2,
3,
4,
5
];
key = ->{a}->{b}->{c}
$VAR1 = \100;
key = ->{b}->{c}
$VAR1 = \3;
key = ->{c}->[4]
$VAR1 = \5;
key = ->{c}->[1]
$VAR1 = \2;
key = ->{c}->[3]
$VAR1 = \4;
key = ->{a}->{b}
$VAR1 = {
'e' => 101,
'c' => 100
};
key = ->{b}
$VAR1 = {
'c' => 3,
'd' => 4
};
key = ->{c}->[2]
$VAR1 = \3;
key = ->{a}
$VAR1 = {
'k' => {},
'b' => {
'e' => 101,
'c' => 100
}
};
key = ->{a}->{k}
$VAR1 = {};
key = ->{b}->{d}
$VAR1 = \4;
key = ->{a}->{b}->{e}
$VAR1 = \101;
$VAR1 = {
'c' => [
1,
2,
10,
4,
5
],
'a' => {
'k' => {},
'b' => {
'e' => 101,
'c' => 200
}
},
'b' => {
'c' => 3000,
'd' => 4
}
};