У меня есть скрипт Perl, который анализирует текстовый файл (может быть окончанием строки UNIX или Windows), сохраняя смещения файлов, когда он находит что-то интересное.Perl read seek tell и текстовые файлы. Слишком много байтов считывается. Слои и обработка новой строки
open(my $fh, $filename);
my $groups;
my %hash;
while(<$fh>) {
if($_ =~ /interesting/) {
$hash{$groups++}{offset} = tell($fh);
}
}
close $fh;
Тогда позже в сценарии я хочу, чтобы произвести «N» копии текстового файла, но с дополнительным содержанием в каждой «интересной» области. Для этого я прохожу через хеш смещений:
foreach my $group (keys %hash) {
my $href = $hash{$group};
my $offset = $href->{offset};
my $top;
open($fh, $file);
read($fh, $top, $offset);
my $bottom = do{local $/; <$fh>};
close $fh;
$href->{modified} = $top . "Hello World\n" . $bottom;
}
Проблема заключается в том, что команда чтения считывает слишком много байтов. Я подозреваю, что это проблема с окончанием строки, так как количество байтов (символов?) Не совпадает с номером строки. Используя Notepad ++, команда tell()
возвращает реальное смещение в точку интереса, но с использованием этого значения смещения в read()
возвращает символы, прошедшие точку интереса.
Я попытался добавить binmode($fh)
прямо после команды open()
до read()
. Это находит правильную позицию в текстовом файле, но затем я получаю (CR + CRLF) вывод, а текстовый файл заполнен двойными возвратами каретки.
Я играл со слоями: crlf,: bytes, но никакого улучшения.
Бит застрял!
Почему бы вам не «искать» позиции, открывая файл только один раз? – choroba
'CRLF' не символ. Текстовый файл Windows имеет строки, заканчивающиеся на * два символа 'CR' и' LF' или возврат каретки и перевод строки. Трудно поверить, что ваш файл * «полный двойных возвратов каретки» *. – Borodin
Это то, что я получаю, когда добавляю binmode(). Как строка байтов:/******************************************* ****/CRCRLF/* Linker Script */CRCRLF – Chris