2016-08-23 100 views
0

我需要在Perl中创建依赖关系的散列。该程序1取决于从程序2 program4 program10 program5 program7 program6等数据是随机例如生成:程序依赖的Perl嵌套散列

#!/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 

此代码不能真正工作:

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

但是,如果我改变了第22行:

$dependsOrder->{$dependency} = 1; 

有:

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

它工作正常,但我没有默认值:

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

什么是错误的,我推理的默认值?

+0

是什么'1'是什么意思?为什么你想要默认值1? –

+1

如果存在循环依赖关系,您会期望做什么?你的例子有一个(p1 - > p4 - > p1) –

+0

这只是一个想法。我需要依赖树来对一系列程序进行排序。 这是错误的例子。事实上,我没有循环依赖。 – piecia

回答

1

的数据减少了以下允许更有效地审查这个问题:

program1: program2 
program2: program7 

在第一种情况下,你做了什么归结为

$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}包含1 ,并且$d->{p2}包含对在最后一行中修改的散列的引用。


在第二种情况下,你做了什么归结下来到

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

$d->{p1}{p2}$d->{p2}含有相同的哈希值,这是在最后一行修改引用。


您的代码也可以写成如下:

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} ||= {}; 
    } 
}