2013-02-08 4 views
3

Я хочу прочитать входной файл по строкам, но этот файл имеет неизвестный символ окончания.Perl - неизвестный символ конца строки

Редактор vim также не знает этого, он представляет этот символ как ^A и сразу же начинается с символов новой строки. То же самое для perl. Он пытался загрузить все строки за один раз, потому что он игнорирует этот странный символ конца строки.

Как установить этот символ как конец строки для perl? Я не хочу использовать для этого какой-либо специальный модуль (из-за нашей строгой системы), я просто хочу определить символ (может быть, в коде hex) конца строки.

Другой вариант - преобразовать файл в другой, с хорошим символом конца строки (заменить их). Могу ли я сделать это простым способом (что-то вроде sed на входном файле)? Но все должно быть сделано в perl.

Возможно?

Теперь мое чтение часть выглядит следующим образом:

open (IN, $in_file); 
$event=<IN>; # read one line 

ответ

4

^A характер вы упоминаете это «начало товарной позиции» характер. Вы можете установить для этого персонажа специальную переменную Perl $/. Хотя, если вы хотите, чтобы ваш код, чтобы быть читаемыми и редактироваться парня, который приходит после вас (и использует другой редактор), я хотел бы сделать что-то вроде этого:

use English; 

local $INPUT_RECORD_SEPARATOR = "\cA" # 'start of heading' character 

while (<>) 
{ 
    chomp; # remove the unwanted 'start of heading' character 
    print $_ . "\n"; 
} 

От Perldoc:

$ INPUT_RECORD_SEPARATOR
$/

Входной разделитель записей, новая строка по умолчанию. Это влияет на идею Перла о том, что такое «линия».

Подробнее о special character escaping на PerlMonks.

Ох, и если вы хотите, вы можете ввести "начало товарной позиции" характер в VI, в режиме вставки, нажав CTRL + V, затем CTRL +A.

изменения: добавлены local за предложение DRT в

+0

Спасибо! Он работает очень хорошо :) Спасибо за объяснение^Персонажи, мне это было нужно. – srnka

+0

при использовании '$ /' используйте его как 'local $/= '^ A''. Потому что это встроенная специальная переменная, а 'local' будет изменять ее только для этого блока и не повлияет на другую часть скрипта. – 2013-02-08 12:44:29

+0

'^ A' представляет символ« начало заголовка »(' '\ cA" 'aka' chr (0x01) '). Линейный канал ('' \ cJ "' aka 'chr (0x0A)') будет представлен с использованием '^ J' в этой нотации. – ikegami

Смежные вопросы