Другие ответы помогут вам лучше решить вашу проблему. Мой концентрируется на объяснении, почему ваш код не работает.
Суть вашего кода здесь:
$old++;
$new++;
for (my $i = 0; $i < 42; $i++) {
while(<IN>) {
$_ =~ s/$old/$new/g;
print OUT $_;
}
}
Вы увеличиваете значения $old
и $new
вне своих циклов. И вы никогда не измените эти значения снова. Таким образом, вы делаете одну и ту же замену (меняя 40961 на 41985) 42 раза. Вы никогда не пытаетесь изменить какие-либо другие числа.
Также посмотрите на цикл while
, который читает из IN
. На первой итерации (когда $i
равен 0) вы читаете все данные из IN
, а указатель файла остается в конце файла. Поэтому, когда вы снова входите в цикл while
на второй итерации (и всех последующих итерациях), вы вообще не читаете данные из файла. Вам необходимо сбросить указатель файла на начало файла в конце каждой итерации.
О, и основная логика неверна. Если вы подумаете об этом, вы в конечном итоге будете записывать каждую строку в выходной файл 42 раза. Вы должны сделать все возможные замены перед написанием строки. Таким образом, ваш внутренний цикл должен быть внешним (и наоборот).
Соединяя эти предложения, вам нужно что-то вроде этого:
my $old = 40960;
my $change = 1024;
while (<IN>) {
# Easier way to write your loop
for my $i ( 1 .. 42 ) {
my $new = $old + $change;
# Use \b to mark word boundaries
s/\b$old\b/$new/g;
$old++;
}
# Print each output line only once
print OUT $_;
}