0

I need create hash of dependency in Perl. The program1 depends from program2 program4 program10 program5 program7 program6 etc. Data are randomly generated for example:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use English qw( -no_match_vars );

my $dependsOrder = {};
while (my $line = <DATA>) {
    chomp $line;
    my ( $component, $depends ) = split /:/, $line;
    if ( exists $dependsOrder->{$component} and $dependsOrder->{$component} == 1 ) {
        $dependsOrder->{$component} = {};
    }
    if ( $depends ) {
        $depends =~ s/^\s+|\s+$// if $depends;
        my @depends = split /\s+/, $depends;
        for my $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 really works:

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

But if I change the 22nd line:

$dependsOrder->{$dependency} = 1;

with:

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

It works fine, but I do not have a default value:

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

What is wrong in my reasoning with default values?

3
  • What does 1 mean? Why do you want a default value of 1? Commented Aug 23, 2016 at 22:27
  • 1
    What do you expect to do if there is a circular dependency? Your example has one (p1 -> p4 -> p1) Commented Aug 23, 2016 at 22:36
  • This was only an idea. I need dependency tree for sorting an array of programs. And this was wrong bad example. In fact I do not have a circular dependency. Commented Aug 24, 2016 at 7:16

1 Answer 1

1

Reducing the data to the following allows the problem to be examined more effectively:

program1: program2
program2: program7

In the first case, what you do 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, and $d->{p2} contains a reference to a hash which is modified in the last line.


In the second case, what you do boils down to

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

$d->{p1}{p2} and $d->{p2} contain references to the same hash, which is modified in the last line.


Your code could have been written as follows:

my %dependency_tree;
while (<DATA>) {
    chomp;
    my ( $component, $depends ) = split /:/;
    $dependency_tree{$component} ||= {};
    for my $dependency (split ' ', $depends) {
        $dependency_tree{$component}{$dependency} =
            $dependency_tree{$dependency} ||= {};
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.