Perl 我如何处理固定长度记录的二进制文件,中间没有换行符?

Perl 我如何处理固定长度记录的二进制文件,中间没有换行符?,perl,binaryfiles,Perl,Binaryfiles,我有一个文本文件,它由固定长度的记录组成,但都在一行中,中间没有换行符。用Perl处理它的最佳方法是什么?谢谢 在这里可能有用。您可以指定字符列表(使用“c”、“c”或“W”),它将自动解压缩到列表中。有关要使用的选项,请参阅文档。此处可能有用。您可以指定字符列表(使用“c”、“c”或“W”),它将自动解压缩到列表中。有关要使用的选项,请参阅文档。使用读取文件句柄、标量、长度函数将块一次读取到缓冲区中 use constant LEN => 60; while (!eof $fh) {

我有一个文本文件,它由固定长度的记录组成,但都在一行中,中间没有换行符。用Perl处理它的最佳方法是什么?谢谢

在这里可能有用。您可以指定字符列表(使用“c”、“c”或“W”),它将自动解压缩到列表中。有关要使用的选项,请参阅文档。

此处可能有用。您可以指定字符列表(使用“c”、“c”或“W”),它将自动解压缩到列表中。有关要使用的选项,请参阅文档。

使用
读取文件句柄、标量、长度
函数将块一次读取到缓冲区中

use constant LEN => 60;
while (!eof $fh) {
    my $len = read $fh, $buf, LEN;
    die "short read" if $len < LEN;
    # processing...
}
使用常量LEN=>60;
而(!eof$fh){
my$len=读取$fh,$buf,len;
如果$len

。。。并使用正则表达式、
unpack
或您喜欢的方式处理缓冲区。

使用
读取文件句柄、标量、长度
函数将块一次读取到缓冲区中

use constant LEN => 60;
while (!eof $fh) {
    my $len = read $fh, $buf, LEN;
    die "short read" if $len < LEN;
    # processing...
}
使用常量LEN=>60;
而(!eof$fh){
my$len=读取$fh,$buf,len;
如果$len

。。。并使用正则表达式、
解包
,或您喜欢的方式处理缓冲区。

首先,让我们打开文件,确保它处于bin模式:

open my $fh, '<', 'file.name' or die "Cannot open file.name: $!";
binmode $fh;
现在,让我们看一下记录:

while (my $record = <$fh>) {
现在您可以处理@elements,并完成while(){}循环:

整个“计划”:


打开我的$fh,”首先,让我们打开文件,确保它处于bin模式:

open my $fh, '<', 'file.name' or die "Cannot open file.name: $!";
binmode $fh;
现在,让我们看一下记录:

while (my $record = <$fh>) {
现在您可以处理@elements,并完成while(){}循环:

整个“计划”:


打开我的$fh,'为什么透明?也许您的意思是$/=\number不太为人所知。没错。但另一方面,它非常方便,因为您可以像往常一样使用文件句柄。sysread更透明,因为您知道您读取的不是一行,而是固定数量的字节。当您不处理行时,表现得像处理行一样会使问题变得更加困难。许多二进制格式的对象在格式中没有一致的字节长度,因此您经常为每一位读取不同的字节数。@brian d foy:当然。如果我们要处理可变长度的记录,我会用另一种方式来写。但由于这显然是固定长度的,所以$/和标准的使用似乎更容易。至少对我来说,为什么是透明的?也许您的意思是$/=\number不太为人所知。没错。但另一方面,它非常方便,因为您可以像往常一样使用文件句柄。sysread更透明,因为您知道您读取的不是一行,而是固定数量的字节。当您不处理行时,表现得像处理行一样会使问题变得更加困难。许多二进制格式的对象在格式中没有一致的字节长度,因此您经常为每一位读取不同的字节数。@brian d foy:当然。如果我们要处理可变长度的记录,我会用另一种方式来写。但由于这显然是固定长度的,所以$/和标准的使用似乎更容易。至少对我来说。
open my $fh, '<', 'file.name' or die "Cannot open file.name: $!";
binmode $fh;
local $/ = \120;
while (my $record = <$fh>) {
  my @elements = unpack("......", $record);
  ...
}
close $fh;