私は、興味のあるものを見つけたときにファイルオフセットを保存するテキストファイル(UNIXまたはWindowsの行末である可能性があります)を分析するPerlスクリプトを持っています。
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;
}
問題は、読み取りコマンドが読み取っているバイト数が多すぎることです。バイト数(文字?)が行番号と同じであるため、これは行末の問題であると思われます。Notepad ++を使用すると、tell()
コマンドは実際のオフセットを対象のポイントに返しますが、そのオフセット値を使用すると、対象read()
のポイントを過ぎた文字が返されます。
の前のコマンドbinmode($fh)
の直後に追加しようとしました。これにより、テキスト ファイル内の正しい位置が検出されますが、(CR + CRLF) 出力が得られ、テキスト ファイルは二重のキャリッジ リターンでいっぱいになります。open()
read()
レイヤー :crlf、:bytes で遊んだことがありますが、改善はありません。
ちょっと立ち往生!