Ваш первый цикл такой:
my @associationsToRemove = ();
foreach my $association ($agentConf->GetAssociations()) {
if ( grep {$_ eq $association->Name()} @agentConfAssociationDeletionsList) {
print "pushing " . $association->Name() . "\n";
push(@associationsToRemove, $association);
}
}
что эквивалентно этому:
my @associationsToRemove = ();
my @associations = $agentConf->GetAssociations();
foreach my $association (@associations) {
if ( grep {$_ eq $association->Name()} @agentConfAssociationDeletionsList) {
print "pushing " . $association->Name() . "\n";
push(@associationsToRemove, $association);
}
}
Итак, GetAssociations () вызывается перед первой итерацией
петля. Здесь нет слова «не удалять во время итерации», что
ловушка обычно возникает внутри each
петель на основе и в стиле C for
петли. Проблема, вероятно, что-то внутри RemoveAssocition()
Метод.
Другая возможность состоит в том, что $association
объекты возвращаются из
GetAssociations()
не копируются полностью, когда возвращаются обратно:
Объекты $association
могут быть внутренними данными из $agentConf
. Это может быть скрытая ловушка «не удаляй при повторении», трудно сказать, не зная о реализации $agentConf
или даже о том, каков ее интерфейс.
Кроме того, вы пропускаете символ на agentConf
во втором цикле, но
это, вероятно, просто опечатка.