有人可以向我解释这个循环吗?

时间:2018-11-26 20:53:34

标签: perl

我有以下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 :(得分:7)

read (FILE,$_,4):从FILE输入流中读取4个字节并将其加载到变量$_

$rec_len = unpack("N",$_):将变量$_的前4个字节按big-endian顺序解释为无符号32位整数,并分配给变量$rec_len

read (FILE,$_,$rec_len):将FILE流中的$rec_len个字节读入变量$_

substr($_,0,2):变量$_的前两个字符

"\xF5\xF2":一个由两个字节组成的字符串,由字节245和242组成

$_ = substr($_,0,117):将$_设置为$_的前117个字符

use Encode;print decode ('cp1047', $_):使用“代码页1047”(即EBCDIC)解释$_的内容,并输出到标准输出

答案 1 :(得分:4)

-w是启用warnings的旧方法。

my声明了一个词法范围变量。

带有<

open打开一个文件供读取,文件名取自@ARGV数组,即程序的参数。 FILE是与文件关联的文件句柄。

read将四个字节读取到$_变量中。 unpack将其解释为32位无符号长(因此以下条件只有在为0时才会失败)。

下一次读取将再次向$_读取那么多字节。 substr提取一个子字符串,如果前两个字节为“ \ xf5 \ xf2”,则它将字符串缩短为前117个字节。然后,它将字符串转换为代码页1047。