in reply to Array undefining istelf?

I don't spot the problem; are you getting the amount of output you expect? That is, do you have evidence that the last is triggering correctly? It would be good to have a check that each of your regexes in the foreach() loop is matching only once.

Your code is complicated enough that you should be using strict and declaring all variables (in the sub as my() variables where possible).

A more concise way to say:

for ($i=0;$sof_to_delete>0;$sof_to_delete--) {shift(@sof_i);}
is
splice(@sof_i, 0, $sof_to_delete);
A perhaps better way to destructively use the beginning of an array, would be to replace both for loops in get_i with:
while (defined($_ = shift(@sof_i)) { ... body of your foreach (@sof_i) ... }
Another possibility is to set the input record separator to "="x30 where you are reading into @sof_i (assuming it comes from a filehandle at some point) so you get only one array element per thing you want to handle.