Проще всего это сделать с помощью двух замен:
$string =~ s/A/123/g;
$string =~ s/B/456/g;
или даже (используя встроенный цикл for
в качестве сокращения для применения нескольких замен к одной строке):
s/A/123/g, s/B/456/g for $string;
Конечно, для более сложных шаблонов это может не дать таких же результатов, как выполнение обеих подстановок за один проход; в частности, это может произойти, если шаблоны могут перекрываться (как в A = YZ
, B = XY
) или если шаблон B может соответствовать строке, заменяемой шаблоном A.
Если вы хотите сделать это за один проход, наиболее общим решением является использование /e
модификатор, который интерпретирует замену как код Perl, например:
$string =~ s/(A|B)/ $1 eq 'A' ? '123' : '456' /eg;
Вы даже можете включить в подстановку несколько выражений, разделенных точкой с запятой; значение последнего выражения — это то, что будет подставлено в строку. Если вы сделаете это, вам может оказаться полезным использовать парные разделители. для удобочитаемости, например:
$string =~ s{(A|B)}{
my $foo = "";
$foo = '123' if $1 eq 'A';
$foo = '456' if $1 eq 'B';
$foo; # <-- this is what gets substituted for the pattern
}eg;
Если ваши шаблоны представляют собой постоянные строки (как в простых примерах выше), еще более эффективным решением будет использование хэша поиска, например:
my %map = ('A' => '123', 'B' => '456');
$string =~ s/(A|B)/$map{$1}/g;
С этим методом вам даже не нужен модификатор /e
(хотя для этого конкретного примера его добавление не имеет значения). Преимущество использования /e
заключается в том, что он позволяет реализовать более сложные правила выбора замены, чем позволяет простой поиск по хешу.
person
Ilmari Karonen
schedule
12.06.2015