Если я правильно понимаю вашу проблему, дело в том, как вы читаете файл:
while ($line = <$ifh>)
по своей сути является построчным подходом. Он использует содержимое «переменной завершения строки» ($/
), чтобы понять, где разбивать строки. Один простой способ изменить это поведение - это не определять $/
:
my $oldTerminator = $/;
undef $/;
....... <your processing here>
$/ = $oldTerminator;
Итак, ваш файл будет всего одной строкой, но я не уверен, что произойдет с вашим кодом.
Другой подход заключается в следующем (учитывая то, что я сказал о том, что вы читаете файл построчно): вместо выполнения
`push @data, $line;`
на каждой итерации цикла просто накапливайте строки, которые вы прочитали, в переменной
$line .= $_;
(как вы уже делаете), и выполните push
только в конце, только один раз. На самом деле, этот второй подход будет более применим к вашему коду (вам нужно только удалить два имеющихся у вас оператора push и поместить один вне цикла).