foreach key
foreach dependency of that key
if this dependency is the one I want to delete, delete this key
continue looping
continue looping
####
if( grep { $_ eq $key } @{$dependencies{$key}} ) {
print "Going to call sub for $key\n";
mydel($key);
}
##
##
my %requiredby;
for my $key (keys $dependencies) {
for my $dep (@{$dependencies{$key}}) {
push @{$requiredby{$dep}}, $key;
}
}
# Or alternately, using a statement modifier to be shorter
my %requiredby;
for my $key (keys %dependencies) {
push @{$requiredby{$_}}, $key for @{$dependencies{$key}};
}
##
##
#!/usr/bin/env perl5
use strict;
use warnings;
my %hash = ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5);
my %dependencies = ( 'one' => [], 'two' => [], 'three' => ['four'],
'four' => ['one','two'], 'five' => ['three'] );
my %requiredby;
for my $key (keys %dependencies) {
push @{$requiredby{$_}}, $key for @{$dependencies{$key}};
}
sub my_del {
my $thiskey = shift;
# Find all the keys that depend on us, and so have to go
for my $del ( @{$requiredby{$thiskey}} ) {
# Recurse and delete one key that requires us
print "Going to call sub for $del\n";
my_del($del);
}
# And finally get rid of us
delete $hash{$thiskey};
print "Deleting $thiskey\n";
}
my_del('one');
##
##
% ./tst.pl
Going to call sub for four
Going to call sub for three
Going to call sub for five
Deleting five
Deleting three
Deleting four
Deleting one