程序依赖的Perl嵌套散列
问题描述:
我需要在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' => {
什么是错误的,我推理的默认值?
答
的数据减少了以下允许更有效地审查这个问题:
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} ||= {};
}
}
是什么'1'是什么意思?为什么你想要默认值1? –
如果存在循环依赖关系,您会期望做什么?你的例子有一个(p1 - > p4 - > p1) –
这只是一个想法。我需要依赖树来对一系列程序进行排序。 这是错误的例子。事实上,我没有循环依赖。 – piecia