Что касается записи в тот же файл, обратите внимание на ответ Винко. Что касается замены строк, пожалуйста, проверьте этот фрагмент:
my @arr1 = ("AA", "BB", "CC", "DD", "EE");
my %replacements = map { ($arr1[$_] => $_ + 1) } (0..$#arr1);
my $regexp = join( '|', sort { length($b) <=> length($a) } @arr1);
open F2, $file;
while (<F2>) {
my $str = $_;
$str =~ s/($regexp)/$replacements{$1}/ge;
print $str;
}
close(F2);
Важные части:
my %replacements = map { ($arr1[$_] => $_ + 1) } (0..$#arr1);
Он создает хеш с ключами от @ arr1, а значения - это индекс заданного значения в @ arr1, увеличенный на 1.
Например, для @ arr1 = ("a", "b", "d", "c"); % замен будет: ("a" => 1, "b", => 2, "c" => 4, "d" => 3);
my $regexp = join( '|', sort { length($b) <=> length($a) } @arr1);
Это строит базовое регулярное выражение для поиска всех слов из @ arr1. Часть сортировки упорядочивает слова по убыванию. Таким образом, для @ arr1 = ("a", "ba", "bac") $ regexp будет равно "bac | ba | a".
Этот порядок важен, так как в противном случае могут возникнуть проблемы, если какое-либо из слов будет префиксом любого другого слова (как, например, с "ba" и "bac" в моем примере).
Как последнее слово, использование файловых дескрипторов в качестве FH весьма не рекомендуется, поскольку они являются глобальными и создают «интересные» проблемы в более сложных программах. Вместо этого используйте open следующим образом:
open my $fh, 'filename';
или еще лучше:
open my $fh, '<', 'filename';