Почему Strawberry Perl не удаляет эти символы подачи формы? - PullRequest
0 голосов
/ 01 февраля 2012

В настоящее время я использую Strawberry Perl в WinXP и пытаюсь обработать плоский файл в формате Unix. Плоский файл использует символы перевода строки для разделения полей и символы перевода строки для разделения записи. Я пытаюсь преобразовать FF во что-либо еще (CRLF, ';', TAB и т. Д.). Я попытался использовать следующие perl однострочники безуспешно:

perl -p -e 's/\f/\r\n/g' < unix.txt > dos.txt
perl -p -e 's/\x0c/\x0d\x0a/g' < unix.txt > dos.txt
perl -p -e 's/\f/\t/g' < unix.txt > dos.txt

Единственное, что я заметил, это то, что в dos.txt все символы LF преобразуются в CRLF, но символы FF остаются. Я даже пытался обработать файл dos.txt, снова пытаясь заменить FF, но все еще не играли в кости. Я все еще новичок в Perl, так что, может быть, я что-то упустил? Кто-нибудь знает, почему вышеприведенные команды не выполняют то, что я от них хочу?

Ответы [ 2 ]

8 голосов
/ 01 февраля 2012

Проблема в том, что оболочка Windows не интерпретирует одинарные кавычки, как оболочка Unix.Вы должны использовать двойные кавычки в ваших командах.

C:\ perl -e "print qq/foo\fbar/" > test.txt
C:\ type test.txt
foo♀bar
C:\ perl -pe 's/\f/__FF__/' < test.txt
foo♀bar
C:\ perl -pe "s/\f/__FF__/" < test.txt
foo__FF__bar
2 голосов
/ 01 февраля 2012

Вы хотите binmode:

perldoc -f binmode
   binmode FILEHANDLE, LAYER
   binmode FILEHANDLE
           Arranges for FILEHANDLE to be read or written in "binary" or
           "text" mode on systems where the run-time libraries distinguish
           between binary and text files.  If FILEHANDLE is an expression,
           the value is taken as the name of the filehandle.  Returns true
           on success, otherwise it returns "undef" and sets $! (errno).

           On some systems (in general, DOS and Windows-based systems)
           binmode() is necessary when you're not working with a text
           file.
...