我试图想出一个创造性的方式来确定依赖关系,因此我可以按正确的顺序启动测试的回归。Perl依赖关系树求解器
例如:
a: d, e, f
b: c, d
c: f
d: e
这意味着试验 “一” 取决于测试 “d,e和f” 等的完成。
我有下面的代码,将打印“叶”节点“e”和“f”,但我坚持如何去遍历和打印父节点。任何提示将非常感谢。
谢谢!
my @input = ("a:d,e,f", "b:c,d", "c:f", "d:e");
my %Tests =();
my %Built =();
## Build Structure
foreach my $elem (@input) {
my $depends = [];
my $target;
($target,$depends) = parseData($elem);
$Tests{$target} = $depends; ## Setting array ref to hashkey $target
}
sub parseData {
my $data = shift;
my ($target, $deps) = split(/:/, $data);
my @deps;
@deps = split(/,/, $deps);
return ($target,\@deps);
}
foreach my $key (keys %Tests) {
doIT(\%Tests, \%Built, $key);
}
sub doIT {
my ($testRef, $builtRef, $target) = @_;
my $depends = $testRef->{$target};
if(exists $builtRef->{$target}) {
return;
}
if(!$depends) {
## No dependency, build it
print "RunTest($target)\n";
$builtRef->{$target}++;
return;
}
foreach my $dep (@$depends) {
doIT($testRef, $builtRef, $dep);
}
}
这是整洁的方法!我不太明白下面这行代码的作用:$ children {$ _} || = {}。你能详细说明这实际上在做什么吗?谢谢! – user3528108
'%children'在哈希结构的哈希中保存父对子关系。 '$ children {$ a_parent} {$ a_child} = 1'。由于一些元素(比如'e'和'f''没有任何子元素,所以只要我看到一个孩子就会初始化这个结构。要查看数据结构的格式,只要'使用Data :: Dump; dd \%孩子;'在第一个'for'循环之后' – Miller
非常好,谢谢你的解释! – user3528108