Разница между рабочим и нерабочим решениями такая же, как разница между
print "#$&"; # Prints `#` and the value of `$&`.
и
print "$replace[$i]"; # Prints the value of `$replace[$i]`.
. Вы можете использовать следующее:
use String::Substitution qw( gsub_modify );
for my $i (0..$#search) {
gsub_modify($data, $search[$i], $replace[$i]);
}
Это более подробное объяснение.
s/$search[$i]/#$&/g
- это сокращение от
s/$search[$i]/ "#$&" /eg
, что эквивалентно
s/$search[$i]/ "#" . $& /eg # Replaces with `#` and the value of `$&`.
/e
вызывает выражение для замены как код Perl, используя его результат в качестве строки замены.
С другой стороны,
s/$search[$i]/$replace[$i]/g
- это сокращение от
s/$search[$i]/ "$replace[$i]" /eg
, что эквивалентно
s/$search[$i]/ $replace[$i] /eg # Replaces with the value of `$replace[$i]`.