И еще $p[1]=@; if/o/;push@;,$_};$h=-1;$l=1}@F;$k=-($j=@F) можно сделать так $p[$l=1]=@;if/o/;push@;,$_}}@F;$h=-1;$k=-($j=@F) -2 символа. Плюс, из-за do{} вносить $h=-1 между двумя } в принципе смысла не имеет, все равно ; нужна.