perl - 如何在 Perl 中读取二进制文件

标签 perl

我在编写 Perl 脚本来读取二进制文件时遇到问题。

我的代码如下,其中 $file是二进制格式的文件。我试图通过网络搜索并应用我的代码,试图将其打印出来,但似乎效果不佳。

目前它只打印“&&&&&&&&&&&”和“”ppppppppppp”,但我真正想要的是它可以打印出$line ,以便我以后可以做一些其他的后期处理。另外,我不太确定 $data 是什么正如我所见,它是文章示例中代码的一部分,说明假设是一个标量。我需要有人可以指出我的代码中哪里出错了。下面是我所做的。

my $tmp = "$basedir/$key";
opendir (TEMP1, "$tmp");
my @dirs = readdir(TEMP1);
closedir(TEMP1);

foreach my $dirs (@dirs) {
    next if ($dirs eq "." || $dirs eq "..");
    print "---->$dirs\n";
    my $d = "$basedir/$key/$dirs";
    if (-d "$d") {
        opendir (TEMP2, $d) || die $!;
        my @files = readdir (TEMP2); # This should read binary files
        closedir (TEMP2);

        #my $buffer = "";
        #opendir (FILE, $d) || die $!;
        #binmode (FILE);
        #my @files =  readdir (FILE, $buffer, 169108570);
        #closedir (FILE);

        foreach my $file (@files) {
            next if ($file eq "." || $file eq "..");
            my $f = "$d/$file";
            print "==>$file\n";
            open FILE, $file || die $!;
            binmode FILE;
            foreach ($line = read (FILE, $data, 169108570)) {
                print "&&&&&&&&&&&$line\n";
                print "ppppppppppp$data\n";
            }
            close FILE;
        }
    }
}

我已经更改了我的代码,使其如下所示。现在我可以读取 $data。感谢 J-16 SDiZ 指出这一点。我试图将我从二进制文件中获得的信息推送到一个名为“@array”的数组中,想从数组中 grep 数据以获取匹配“p04”但失败的字符串。有人可以指出错误在哪里吗?
my $tmp = "$basedir/$key";
opendir (TEMP1, "$tmp");
my @dirs = readdir (TEMP1);
closedir (TEMP1);

foreach my $dirs (@dirs) {
    next if ($dirs eq "." || $dirs eq "..");
    print "---->$dirs\n";
    my $d = "$basedir/$key/$dirs";
    if (-d "$d") {
        opendir (TEMP2, $d) || die $!;
        my @files = readdir (TEMP2); #This should read binary files
        closedir (TEMP2);

        foreach my $file (@files) {
            next if ($file eq "." || $file eq "..");
            my $f = "$d/$file";
            print "==>$file\n";
            open FILE, $file || die $!;
            binmode FILE;
            foreach ($line = read (FILE, $data, 169108570)) {
                print "&&&&&&&&&&&$line\n";
                print "ppppppppppp$data\n";
                push @array, $data;
            }
            close FILE;
        }
    }
}

foreach $item (@array) {
    #print "==>$item<==\n"; # It prints out content of binary file without the ==> and <== if I uncomment this.. weird!
    if ($item =~ /p04(.*)/) {
        print "=>$item<===============\n"; # It prints "=><===============" according to the number of binary file I have.  This is wrong that I aspect it to print the content of each binary file instead :(
        next if ($item !~ /^w+/);
        open (LOG, ">log") or die $!;
        #print LOG $item;
        close LOG;
    }
}

同样,我按如下方式更改了我的代码,但它仍然无法正常工作,因为它无法通过检查“日志”文件来正确地搜索“p04”。它确实grep了整个文件,包括这样的二进制文件“@^@^@^@^G^D^@^@^@^^@p04bbhi06^@^^@^@^@^@^@^@^@^ @hh^R^@^@^@^^@^@^@p04lohhj09^@^@^@^^@@"。我所指的是它只用 p04 来 grep 任何东西,比如 grepping p04bbhi06 和 p04lohhj09。这是我的代码的运行方式:-
foreach my $file (@files) {
    next if ($file eq "." || $file eq "..");
    my $f = "$d/$file";
    print "==>$file\n";
    open FILE, $f || die $!;
    binmode FILE;
    my @lines = <FILE>;
    close FILE;
    foreach $cell (@lines) {
        if ($cell =~ /b12/) {
            push @array, $cell;
        }
    }
}

#my @matches = grep /p04/, @lines;
#foreach $item (@matches) {
foreach $item (@array) {
    #print "-->$item<--";
    open (LOG, ">log") or die $!;
    print LOG $item;
    close LOG;
}

最佳答案

用:

$line = read (FILE, $data, 169108570);

数据在$data ;和 $line是读取的字节数。
       my $f = "$d/$file" ;
       print "==>$file\n" ;
       open FILE, $file || die $! ;

我猜完整路径在 $f ,但您正在打开 $file . (在我的测试中——即使 $f 也不是完整路径,但我猜你可能还有其他一些胶水代码......)

如果您只想遍历目录中的所有文件,请尝试 File::DirWalkFile::Find .

关于perl - 如何在 Perl 中读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8920215/

相关文章:

Perl ImageMagick : how to disable printing of command output?

xml - Perl:从 XML 输出填充数组(通过 Eutils 的 PubMed UID)

perl - 如何检查 Perl 核心中模块的错误历史记录?

java - 需要将 RAW 打印数据转换为 ps/pdf 或从 Java 打印

perl - 如何优雅地调用名称保存在变量中的 Perl 子例程?

perl - 让Perl返回正确的退出代码

perl - 如何清除 Class::DBI 的内部缓存?

Perl SWF::Builder 淡入淡出图像

Linux Perl - 将十六进制值转换为十进制

perl - 对使用 perl 合并哈希输出感到困惑