Может кто-нибудь объяснить мне этот цикл? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код Perl.Я знаю, каков будет конечный результат: если я запустлю его и передам файл x9.37, он будет выплевывать каждое поле текста.Это здорово, но я пытаюсь перенести это на другой язык и вообще не могу читать Perl.Если кто-то может превратить это в какую-то форму псевдокода (мне не нужна рабочая Java - я могу написать эту часть), мне просто нужен кто-то, чтобы объяснить, что происходит в Perl ниже!

#!/usr/bin/perl -w
use strict;
use Encode;

my $tiff_flag = 0;
my $count = 0;

open(FILE,'<',$ARGV[0]) or die 'Error opening input file';
binmode(FILE) or die 'Error setting binary mode on input file';

while (read (FILE,$_,4)) {
  my $rec_len = unpack("N",$_);
  die "Bad record length: $rec_len" unless ($rec_len > 0);
  read (FILE,$_,$rec_len);
  if (substr($_,0,2) eq "\xF5\xF2") {
    $_ = substr($_,0,117);
  }
  print decode ('cp1047', $_) . "\n";
}
close FILE;

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

-w - это старый способ включения предупреждений .

my объявляет переменную с лексической областью.

open с < открывает файл для чтения, имя файла берется из массива @ARGV, то есть параметров программы.FILE - дескриптор файла, связанный с файлом.

read считывает четыре байта в переменную $_. unpack интерпретирует его как 32-разрядную длину без знака (поэтому следующее условие может завершиться ошибкой только при его значении 0).

При следующем чтении это число снова будет считано в $_. substr извлекает подстроку, и если в первых двух байтах присутствует "\ xf5 \ xf2", она сокращает строку до первых 117 байтов.Затем он преобразует строку в кодовую страницу 1047.

0 голосов
/ 27 ноября 2018

read (FILE,$_,4): прочитать 4 байта из входного потока FILE и загрузить в переменную $_

$rec_len = unpack("N",$_): интерпретировать первые 4 байта переменной $_ как 32-разрядное целое число без знакав порядке с прямым порядком байтов присвойте переменной $rec_len

read (FILE,$_,$rec_len): чтение $rec_len байтов из потока FILE в переменную $_

substr($_,0,2): первые два символапеременной $_

"\xF5\xF2": двухсимвольная строка, состоящая из байтов 245 и 242

$_ = substr($_,0,117): установите $_ в первые 117 символов $_

use Encode;print decode ('cp1047', $_): интерпретировать содержимое $_ с помощью "кодовой страницы 1047", то есть EBCDIC и выводить на стандартный вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...