在Perl中,使用open打开描述符来处理文件。除了标准描述符(STDIN、STDOUT、STDERR),还可以创建自己的描述符并进行管理。
Perl使用输入输出层(:encoding、:utf8、:raw等)的概念,以正确处理不同类型的文件和编码。默认情况下,Perl可以在文本模式(换行符转换)或二进制模式下工作。
open my $fh, '<:encoding(UTF-8)', 'file.txt' or die $!; while (my $line = <$fh>) { print $line; } close $fh;
open my $fh, '<:raw', 'image.bin' or die $!; read($fh, my $data, -s 'image.bin'); close $fh;
正确选择层(对于二进制文件使用:raw,对于文本文件使用:encoding(NAME))确保正确的读取和写入。
如果使用
open FH, '<', $file打开文件并读取二进制数据,我们总能获得正确的结果吗?
答案: 不会!如果不指定:raw,在某些平台上Perl会自动转换换行符(例如,在Windows上将CRLF转换为LF)。始终使用:raw模式读取二进制文件:
open my $fh, '<:raw', 'file.bin';
故事
在一个企业项目中,开发者在处理文本日志时未指定编码,认为字符串是可以的。结果在UTF-8编码的日志中有时会出现 "损坏" — 读取的文件读入时损坏,因为Perl错误地解释了字节。只有在
open调用中显式添加层:encoding(UTF-8)后,错误才被修复。
故事
在Windows上复制二进制文件时,通过
open FH, '<', 'binfile.dat'读取数据并在不指定模式的情况下写入。程序 "损坏" 了图像,因为在换行流中CRLF被改为LF,导致无效的二进制数据。层:raw解决了这个问题。
故事
在外部API中,仅要求以UTF-8格式输出STDOUT,而程序员在没有切换写入层的情况下使用了
binmode STDOUT, ':encoding(UTF-8)'后,问题解决了。