satzbu has asked for the wisdom of the Perl Monks concerning the following question:
Dear monks i have a code to replace the hash keys against another hash value it replace the keys but it replace the first match of the key only it cant replace the second time the same key come means it shift the key value pair but i want to replace that key also this is my code
#!/usr/bin/perl use warnings; use strict; use Data::Dumper; use XML::Simple; my %xhash = ('a' => { 'b' => { ################################################# 'e' => 'E', 'c' => 'V', 'c' => 'C', 'content' => 'B' ################################################# }, 'content' => 'A ', 'd' => 'D' }); my %c_hash=('a' => { 'addval' => { 'b' => { 'addval' => { 'e' => { 'addv +al' => {}, 'repv +al' => '5' }, 'c' => { 'addv +al' => {}, 'repv +al' => '3' } }, 'repval' => '2' }, 'd' => { 'addval' => {}, 'repval' => '4' } }, 'repval' => '1' }); my %repl; # lookup table: a => 1, etc. traverse(\%c_hash, sub { my ($key, $val) = @_; $repl{$key} = $val; }, "collect" ); #print Dumper \%repl; # debug traverse(\%xhash, sub { my ($key, $val, $href) = @_; if (exists $repl{$key}) { my $newkey = $repl{$key}; $href->{$newkey} = $val; delete $href->{$key}; } }, "replace" ); print Dumper \%xhash; sub traverse { my ($hash, $callback, $mode) = @_; return unless ref($hash) eq "HASH"; for my $key (keys %$hash) { my $val = $hash->{$key}; if (ref($val) eq "HASH") { traverse($val, $callback, $mode); if ($mode eq "collect") { if (exists $val->{repval}) { $callback->($key, $val->{repval}); } } } if ($mode eq "replace") { $callback->($key, $val, $hash); } } } _output_ $VAR1 = { '1' => { '4' => 'D', 'content' => 'A ', '2' => { ################################################### '3' => 'C', 'content' => 'B ', '5' => 'E' ################################################### } } };
but my required output is
_Required output_ $VAR1 = { '1' => { '4' => 'D', 'content' => 'A ', '2' => { ############################################### '3' => 'C', '3' => 'V' 'content' => 'B ', '5' => 'E' ############################################### } } };
please help me to clear that error
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Help to handle subroutine
by almut (Canon) on Apr 16, 2010 at 11:19 UTC | |
|
Re: Help to handle subroutine
by jethro (Monsignor) on Apr 16, 2010 at 11:19 UTC | |
|
Re: Help to handle subroutine
by choroba (Cardinal) on Apr 16, 2010 at 10:31 UTC |