Zwei Verbesserungsvorschläge:
for (my $i=0; $i <= $#data -1; $i++)
# ersetzen durch:
for my $i (0..$#data-1)
Das ist viel kürzer und sieht nicht so nach C aus :)
Außerdem:
$data[$i] = undef;
# Ersetzen durch
$data[$i] = "";
Denn sonst würde es Warnungen ausgeben...
Außerdem würde es eine Warnung geben, wenn eine Zeile keine 3 Felder hat, die man splitten kann. Das kommt insbesondere dann vor, wenn man die Zeile gerade entfernt hat. Da ist natürlich auch gefragt, wie denn hier das korrekte Verhalten gewünscht wäre... Soll man dann stattdessen nochmal die vorherige Zeile nehmen, weil die Zeilen ja näher zusammengerückt sind?