mvkarthik has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I have a simple code below:
sub get_lower_level_ehms_count() { my %design_hash = %{@_[0]}; local %ehm_count; ##Checking if the design has embedded SMSes if($design_hash{'EMBEDDED_HMS'}) { my @ehms = @{$design_hash{'EMBEDDED_HMS'}}; ##Getting +the list of EHMs under the current DHM foreach(@ehms) { my %ehm_hash = %{$_}; my $design_top = $ehm_hash{'TOP'}; if($ehm_hash{'EMBEDDED_HMS'}) { &get_lower_level_ehms_count(\%ehm_hash +); } if(!($ehm_count{$design_top})) { $ehm_count{$design_top} = @{$ehm_hash{ +'INSTANCES'}}; } else { my $count = $ehm_hash{$design_top}; my $instances = @{$ehm_hash{'INSTANCES +'}}; $count = $count + $instances; $ehm_count{$design_top} = $count; } } } return \%ehm_count; }
Here: ehm_count is the hash that I want it to be local to the main procedure and same needs to be used during recursive calls as well . I dont see it happening. Please help. Thanks, -Karthik

Replies are listed 'Best First'.
Re: Updating the same hash using recursion
by Athanasius (Archbishop) on Aug 20, 2014 at 06:24 UTC

    Hello mvkarthik,

    I moved your post from Perl Monks Discussion to Seekers of Perl Wisdom. Please update your post by adding <code> ... </code> tags to make it readable. In addition, a small driver script together with sample input and desired output would go a long way to explaining what you are trying to accomplish.

    From the node title, I gather you want to share a hash between recursive calls of the subroutine? You have:

    sub get_lower_level_ehms_count() { my %design_hash = %{ @_[0] }; local %ehm_count; ...

    but, after the first call, this makes a local copy of the hash, so it’s effectively the same as using my here. (See local.) Perhaps you want something like this?

    { my %ehm_count; sub get_lower_level_ehms_count { ... } }

    A couple of other points:

    1. In sub get_lower_level_ehms_count() {, the parentheses () are a prototype specifying that the sub takes no arguments. This is clearly not what you want, since you access the first element of @_ within the sub. If you remove the prototype, you can also remove the initial ampersand (&) from the recursive call: get_lower_level_ehms_count(\%ehm_hash);. See perlsub#Prototypes.

    2. In the assignment my %design_hash = %{@_[0]};, @_[0] is actually an array slice. Since you are accessing only a single array element, this is better written as $_[0].

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Re: Updating a same hash using recurrsion ...
by 2teez (Vicar) on Aug 20, 2014 at 06:10 UTC
Re: Updating a same hash using recurrsion ...
by NetWallah (Canon) on Aug 20, 2014 at 14:41 UTC
    Untested, simplified code suggestion:
    sub get_lower_level_ehms_count { my %design_hash = %{$_[0]}; my %ehm_count ; my $embedded = $design_hash{'EMBEDDED_HMS'} or return \%ehm_co +unt; for my $emb (@$embedded) { my $design_top = $emb->{'TOP'}; if($emb->{'EMBEDDED_HMS'}) { $lower_levels = get_lower_level_ehms_count($emb); $ehm_count{$_} += $lower_levels->{$_} for keys %$l +ower_levels; } $ehm_count{$design_top} += scalar @{$emb->{'INSTANCES'}}; } return \%ehm_count; }

            "You're only given one little spark of madness. You mustn't lose it."         - Robin Williams