我有 2 个文件。
- 名为 input.txt 的混淆文件
- 第二个名为 mapping.txt 的文件由键值对组成。
我想从 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)
- 此时,文件指针将位于行尾,因为前面的语句将扫描整行以查找密钥并替换它。
如果我可以将文件指针移动到行首,那么我可以覆盖:
打印输入 $_,"\n"
- 我尝试查找 seek 功能,但无法找到为此目的使用它的方法。
完成后,代码将关闭文件。它将从 mapping.txt 中选择下一个键值对,然后再次扫描输入文件,从开始查找匹配项并替换它们。
最重要的一点是,每次内部 while 循环都会在 input.txt 上运行,该 input.txt 是在内部 while 循环的上一次迭代中修改的。这样,任何成功的查找和替换操作都会继续保存在 input.txt 文件中。
我该怎么做呢?
谢谢。