以字节为单位的字符串大小(窗口)

时间:2014-04-02 21:22:28

标签: perl

我正在尝试通过计算每个字符串的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。

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的实际行为