Normally, unless the child processes detach from the parent's process group, signals will propagate to the children, so when you kill the parent, the children should go down as well. However, if you want to do this explicitely, you can use
Proc::ProcessTable. Something like this (untested):
use strict;
use warnings;
use Proc::ProcessTable;
my $signal=15;
my $parent=shift; # Parent PID from args
my $proc_table=Proc::ProcessTable->new();
foreach my $proc (@{$proc_table->table()}) {
kill($signal, $proc->pid) if ($proc->ppid == $parent);
}
Making this code recursive to kill the children's children is left as an exercise for the reader :) (read: it's Sunday morning and I can't be bothered to do so myself ;) ).