У меня есть 2 файла.
- Запутанный файл с именем input.txt
- Второй файл с именем mapping.txt, состоящий из пар ключ-значение.
Я хочу найти каждое вхождение ключа из mapping.txt в input.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"
- Я попытался найти функцию поиска, но не смог найти способ использовать ее для этой цели.
Как только это будет сделано, код закроет файл. Он выберет следующую пару ключ-значение из mapping.txt и снова просканирует входной файл, начиная с поиска совпадений и их замены.
Самый важный момент заключается в том, что каждый раз внутренний цикл while будет работать с файлом input.txt, который был изменен в предыдущей итерации внутреннего цикла while. Таким образом, любые успешные операции поиска и замены будут сохраняться в файле input.txt.
Как мне это сделать?
Спасибо.