@renee: Deine Loesung hat den Nachteil, dass keine einzelnen Ereignisse vorkommen duerfen, da sonst die Synchronisation fehlt: "RING - 10 sec - RING - 1 sec - RING - 1 sec - RING ..." wuerde nicht erkannt.
Hier eine Alternative (ungetestet):
my @times;
while (<>) {
next unless /RING/i; # alles, was kein RING ist, ueberspringen
if (@times >= 3 && time - shift @times < 3) { # 3 mal und weniger als 3 Sekunden
system ('shellskript &') == 0 or warn "kann shellskript nicht starten: $@";
}
push @times, time;
}