Этот вопрос похож на мой последний , с одним отличием, чтобы сделать игрушечный сценарий более похожим на мой настоящий.
Вот игрушечный скрипт, replace.pl ( Редактировать: теперь с «Использовать строгий;» и т. Д.)
#! /usr/bin/perl -w
use strict;
open(REPL, "<", $ARGV[0]) or die "Couldn't open $ARGV[0]: $!!";
my %replacements;
while(<REPL>) {
chomp;
my ($orig, $new, @rest) = split /,/;
# Processing+sanitizing of orig/new here
$replacements{$orig} = $new;
}
close(REPL) or die "Couldn't close '$ARGV[0]': $!";
print "Performing the following replacements\n";
while(my ($k,$v) = each %replacements) {
print "\t$k => $v\n";
}
open(IN, "<", $ARGV[1]) or die "Couldn't open $ARGV[1]: $!!";
while ( <IN> ) {
while(my ($k,$v) = each %replacements) {
s/$k/$v/gee;
}
print;
}
close(IN) or die "Couldn't close '$ARGV[1]': $!";
Итак, теперь допустим, что у меня есть два файла replacements.txt (используется лучший ответ из последнего вопроса плюс пара замен, не использующая подстановку):
(f)oo,q($1."ar")
cat,hacker
и test.txt:
foo
cat
Когда я запускаю perl replace.pl replacements.txt test.txt
, я бы хотел, чтобы результат был
far
hacker
но вместо этого это '$1."ar"
' (слишком много экранирования), но результаты совсем не похожи (даже с другими предложениями из этого ответа для строки замены). foo
превращается в ar, и, кажется, кот / хакер равен пустой строке.
Итак, какие изменения мне нужно сделать, чтобы заменить .pl и / или replacements.txt? Другие люди будут создавать файл replacements.txt, поэтому я хотел бы сделать этот файл как можно более простым (хотя я признаю, что открываю для них червь регулярных выражений).
Если это невозможно сделать за один шаг, я буду использовать макросы для перечисления всех возможных пар замены для этого конкретного файла и надеюсь, что проблема больше не возникнет.