У меня возникла проблема с написанием скрипта 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;
}
}
Опять же, я изменил свой код следующим образом, но он по-прежнему не работает, как это сделать не в состоянии Grep на «P04» правильно, проверив файл «LOG». Он сделал grep весь файл, включая двоичный, как это: @ @ @ @ @ @ @ @ hh^R^@^@^@ ^^ @^@^@ p04lohhj09^@^@^@ ^^ @@ ". То, что я аспект, это grep что-нибудь с p04, только такие, как 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;
}
['use autodie'] (http://p3rl.org/autodie) –
Нет такой вещи, как« двоичный формат ». Пожалуйста, уточните. В каком формате находятся файлы?Какие у них есть характеристики, которые заставляют вас называть их «в двоичном формате»? – reinierpost
Он находится в формате .gds. Этот файл может читать в Unix с помощью команды strings. Это было возможно в моем скрипте Perl, но я не смог grep данные, которые я хотел (p04 * здесь, в моем коде). – Grace