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
Post a Comment