Perl nested hash of dependency for programs -


i need create hash of dependency in perl. program1 depends program2 program4 program10 program5 program7 program6 etc. data randomly generated example:

#!/usr/bin/env perl  use strict; use warnings;  use data::dumper; use english qw( -no_match_vars );  $dependsorder = {}; while (my $line = <data>) {     chomp $line;     ( $component, $depends ) = split /:/, $line;     if ( exists $dependsorder->{$component} , $dependsorder->{$component} == 1 ) {         $dependsorder->{$component} = {};     }     if ( $depends ) {         $depends =~ s/^\s+|\s+$// if $depends;         @depends = split /\s+/, $depends;         $dependency ( @depends ) {             if ( not exists $dependsorder->{$dependency} ) {                 # default value                 $dependsorder->{$dependency} = 1;             }             $dependsorder->{$component}->{$dependency} = $dependsorder->{$dependency};         }     }     else {         $dependsorder->{$component} = 1;     } } print dumper $dependsorder->{'program1'}; #print dumper $dependsorder->{'program6'};  __data__ program1: program2 program4 program10 program5 program7 program6 program2: program7 program5 program9 program8 program10 program3 program6 program1 program3: program2 program9 program8 program4: program5 program8 program10 program1 program2 program2 program9 program5: program3 program6 program4 program7 program6: program5 program8 program7 program7: program1 program2 program9 program10 program8: program1 program9 program6 program10 program3 program2  program9:  program10: program6 program9 

this code not works:

$var1 = {           'program7' => 1,           'program10' => 1,           'program6' => 1,           'program2' => 1,           'program4' => 1,           'program5' => 1         }; 

but if change 22nd line:

$dependsorder->{$dependency} = 1; 

with:

$dependsorder->{$dependency} = {}; 

it works fine, not have default value:

$var1 = {           'program7' => {                           'program2' => {                                           'program8' => {                                                           'program9' => {},                                                           'program6' => { 

what wrong in reasoning default values?

reducing data following allows problem examined more effectively:

program1: program2 program2: program7 

in first case, boils down to

$d->{p2} = 1; $d->{p1}{p2} = $d->{p2};     # $d->{p1}{p2} = 1; $d->{p2} = {}; $d->{p7} = 1; $d->{p2}{p7} = $d->{p7};     # $d->{p2}{p7} = 1; 

$d->{p1}{p2} contains 1, , $d->{p2} contains reference hash modified in last line.


in second case, boils down to

$d->{p2} = {}; $d->{p1}{p2} = $d->{p2}; $d->{p7} = {}; $d->{p2}{p7} = $d->{p7}; 

$d->{p1}{p2} , $d->{p2} contain references same hash, modified in last line.


your code have been written follows:

my %dependency_tree; while (<data>) {     chomp;     ( $component, $depends ) = split /:/;     $dependency_tree{$component} ||= {};     $dependency (split ' ', $depends) {         $dependency_tree{$component}{$dependency} =             $dependency_tree{$dependency} ||= {};     } } 

Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -