私は2つのファイルを持っています。
- input.txt と呼ばれる難読化されたファイル
- キーと値のペアで構成される mapping.txt という 2 番目のファイル。
input.txt の mapping.txt からキーが出現するたびに見つけて、キーに対応する値に置き換えたいと思います。
一致が成功するたびに、input.txt の行の内容を上書きしたいことに注意してください。
私は次のコードを書きました:
#! /usr/bin/perl
use strict;
use warnings;
(my $mapping,my $input)=@ARGV;
open(MAPPING,'<',$mapping) || die("couldn't read from the file, $mapping with error: $!\n");
while(<MAPPING>)
{
chomp $_;
my $line=$_;
(my $key,my $value)=split("=",$line);
open(INPUT,'+<',$input);
while(<INPUT>)
{
chomp $_;
if(index($_,$key)!=-1)
{
$_=~s/\Q$key/$value/g;
# move pointer to beginning of line
print INPUT $_."\n";
}
}
close INPUT;
}
close MAPPING;
コードの簡単な概要:
- mapping.txt ファイルを読み取りモードで開きます。
- 各行はキーと値のペアであるため、キーと値に分割されます。
- input.txt ファイルを上書きモードで開きます。
- キーが現在の行にあるかどうかを確認します。
- キーが見つかった場合は、キー内のメタ文字を無視して値に置き換えます (\Q を前に付けます)。
- この時点では、前のステートメントが行全体をスキャンしてキーを見つけて置き換えるため、ファイル ポインターは行の末尾になります。
ファイル ポインタを行頭に移動できれば、次のように上書きできます。
出力 INPUT $_,"\n"
- シーク機能を調べてみましたが、この目的で使用する方法がわかりませんでした。
これが完了すると、コードはファイルを閉じます。mapping.txt から次のキーと値のペアを選択し、最初から入力ファイルをスキャンして一致を探し、それらを置き換えます。
最も重要な点は、内側の while ループが毎回、内側の while ループの前の繰り返しで変更された input.txt で動作することです。このようにして、成功した検索および置換操作はすべて、input.txt ファイルに保存され続けます。
どうすればいいですか?
ありがとう。