【发布时间】:2016-05-01 21:24:39
【问题描述】:
我在编写 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;
}
}
再次,我将代码更改如下,但它仍然无法正常工作,因为它无法通过检查“日志”文件正确地 grep“p04”。它确实grep了整个文件,包括像这样的二进制文件“@^@^@^@^G^D^@^@^@^^@p04bbhi06^@^^@^@^@^@^@^@^@^ @hh^R^@^@^@^^@^@^@p04lohhj09^@^@^@^^@@" .我正在考虑的是它只用 p04 grep 任何东西,例如 grep 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;
}
【问题讨论】:
-
没有“二进制格式”之类的东西。请更准确。文件是什么格式的?它们有什么特点让你称它们为“二进制格式”?
-
它是 .gds 格式。该文件可以在 Unix 中使用 strings 命令读取。它在我的 Perl 脚本中是可以读取的,但我无法 grep 我想要的数据(p04* 在我的代码中)。
-
如前所述,使用 File::Find 或其他方式获取文件列表。剩下的,你真正想要什么?如果找到匹配项,输出整个文件内容?还是只是匹配的部分?你想匹配什么?
p04(.*)匹配从“p04”到下一个换行符的任何内容。然后你在$1中拥有那个“任何东西”。去掉所有笨拙的目录内容,首先专注于你想要从单个文件中得到什么。文件有多大?您只阅读前 170MB。而且你一直覆盖“日志”文件,所以它只包含最后一个文件中的最后一项。 -
@reinierpost “二进制文件”下的 OP 可能与文本文件相反 - 例如与perldoc's -X documentation 中的内容相同,请参阅
-B解释。 (引用:-B文件是“二进制”文件(与 -T 相反)。)
标签: perl