为什么Strawberry Perl不会删除这些换页字符?

时间:2012-02-01 17:51:48

标签: perl flat-file strawberry-perl

我目前正在WinXP上运行Strawberry Perl,而我正在尝试处理unix格式的平面文件。平面文件使用换行符来分隔字段,并使用换行符来分隔记录。我正在尝试将FF转换为其他任何东西(CRLF,&#39 ;;',TAB等)。我尝试使用以下perl one-liners但没有成功:

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 个答案:

答案 0 :(得分:8)

问题是Windows shell不像Unix shell那样解释单引号。您应该在命令中使用双引号。

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

答案 1 :(得分:2)

你想要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.