Hi Anand,
On Tue, 23 Aug 2011 05:57:02 -0400
<[email protected]> wrote:
> Hi All,
>
> I am working on the below code to traverse through a hash, but it throws an
> error which states "Can't coerce array into hash at temp.pl line 6."
>
First of all, let me note that the indentation on that code is inconsistent and
erratic. But I was able to fix it by importing it into Vim and using the
"=" key (= "format") and some manual tweaks. Here is the correct version:
[CODE]
#!/usr/bin/perl
use strict;
use warnings;
sub hash_walk {
my $self = shift;
my ($hash, $key_list, $callback) = @_;
while (my ($k, $v) = each (%$hash)) {
push @$key_list, $k;
if (ref($v) eq 'HASH') {
$self->hash_walk($v, $key_list, $callback);
}
else {
$callback->($k, \$v, $key_list);
}
pop @$key_list;
$hash->{$k} = $v;
}
}
my %data = (
a => {
ab => 1,
ac => 2,
ad => {
ada => 3,
adb => 4,
adc => {
adca => 5,
adcb => 6,
},
},
},
b => 7,
c => {
ca => 8,
cb => {
cba => 9,
cbb => 10,
},
},
);
hash_walk(\%data, [], \&replace_all_val_strings);
sub replace_all_val_strings {
my ($k, $v, $key_list) = @_;
printf "k = %-8s v = %-4s key_list = [%s]\n", $k, $$v, "@$key_list";
$$v =~ s/oldstr/newstr/;
printf "k = %-8s v = %-4s key_list = [%s]\n", $k, $$v, "@$key_list";
}
[/CODE]
Now after I did that, I used the perl debugger ("perl -d") to debug the code
(see http://perl-begin.org/topics/debugging/ ), and realised that the problem
was that hash_walk expects 4 arguments (including "$self" which is the object
handle), while it is only given 3 in the initial call, which fails.
Do you need the "$self" or is there a good reason for that? If you do, read the
Object Oriented programming resources at
http://perl-begin.org/topics/object-oriented/ , because otherwise it's just
cargo-cult programming.
Also see:
http://perl-begin.org/tutorials/bad-elements/
Regards,
Shlomi Fish
--
-----------------------------------------------------------------
Shlomi Fish http://www.shlomifish.org/
First stop for Perl beginners - http://perl-begin.org/
Trying to block Internet pornography is like climbing a waterfall and trying
to stay dry. (— one of Shlomi Fish’s Internet Friends)
Please reply to list if it's a mailing list post - http://shlom.in/reply .
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/