我正在尝试通过计算每个字符串的length
来处理大文件时有一个进度指示器。不幸的是,它将每一行结尾"\r\n"
计为单个字符,因此导致我的总计不等。
以下脚本演示:
use strict;
use warnings;
use autodie;
my $file = 'length_vs_size.txt';
open my $fh, '>', $file;
my $length = 0;
while (<DATA>) {
$length += length;
print $fh $_;
}
close $fh;
my $size = -s $file;
print "Length = $length\n";
print "Size = $size\n";
__DATA__
11...chars
22...chars
33...chars
44...chars
55...chars
使用Strawberry Perl,输出:
Length = 55
Size = 60
正如人们所料,在十六进制编辑器中查看文件时,每行结尾实际为"\r\n"
,占用两个字节。因此,总文件大小比长度多5个。
有没有办法计算字符串的字节长度?
我玩过bytes
pragma,甚至还有一点unpack
,但还没有运气。我希望得到一个通用的解决方案,而不仅仅是在我的长度呼叫中加1。
答案 0 :(得分:4)
在Windows上,文件默认启用:crlf
编码图层。在阅读时,这会将\r\n
转换为\n
,并在写作时将其反转。这意味着假定Unix行结尾的脚本不会经常中断。
如果您不想要此行为,请使用:raw
pseudolayer删除所有PerlIO图层:
binmode STDIN, ':raw'; # for one handle
或
use open IO => ':raw'; # for all handles
(当然,这是一种简化,PerlIO
中解释了:raw
的实际行为