我有一个 Perl 脚本,它分析一个文本文件(可以是 UNIX 或 Windows 行结尾),当它找到感兴趣的东西时存储文件偏移量。
open(my $fh, $filename);
my $groups;
my %hash;
while(<$fh>) {
if($_ =~ /interesting/ ) {
$hash{$groups++}{offset} = tell($fh);
}
}
close $fh;
然后稍后在脚本中,我想生成文本文件的“n”个副本,但在每个“有趣”区域都有附加内容。为了实现这一点,我遍历偏移量的散列:
foreach my $group (keys %hash) {
my $href = $hash{$group};
my $offset = $href->{offset};
my $top;
open( $fh, $file);
read( $fh, $top, $offset);
my $bottom = do{local $/; <$fh>};
close $fh;
$href->{modified} = $top . "Hello World\n" . $bottom;
}
问题是读取命令正在读取太多字节。我怀疑这是一个行尾问题,因为输出的字节数(字符?)与行号相同。使用记事本++,该tell()
命令将实际偏移量返回到兴趣点,但使用该偏移量值read()
返回超过兴趣点的字符。
我尝试binmode($fh)
在. 这确实在文本文件中找到了正确的位置,但随后我得到 (CR + CRLF) 输出并且文本文件充满了双回车符。open()
read()
我玩过层:crlf,:bytes,但没有任何改进。
有点卡住了!