Но /
- это граница слова. От perldoc perlreref :
\b
Соответствует границе слова (между \w
и \W
).
В свете вашего комментария ниже, вам следует избегать цикла:
#!/usr/bin/perl
use strict; use warnings;
use Regex::PreSuf;
my %lookup = (
"DEXX" => "AREX",
"AREX" => "CUBE",
);
my $doc = 'DEXX AREX AREX DEXX AREX DEXX DEXX DEXX AREX';
my $re = presuf keys %lookup;
$doc =~ s{($re)}{$1/$lookup{$1}}g;
print $doc, "\n";
Выход:
DEXX/AREX AREX/CUBE AREX/CUBE DEXX/AREX AREX/CUBE DEXX/AREX DEXX/AREX DEXX/AREX
AREX/CUBE
Конечно, вам не нужно использовать Regex :: PreSuf , если у вас есть только два ключа:
s{(AREX|DEXX)}{$1/$lookup{$1}}g;
тоже подойдет. Но для более длинного списка ключей я нахожу Regex :: PreSuf очень удобным.
Обновление: Конечно, если в любом случае в тексте могут встречаться клавиши, вы можете использовать uc
для преобразования при поиске замены:
Итак, либо
$doc =~ s{($re)}{join '/', uc($1), $lookup{uc $1}}eig;
или
$doc =~ s{($re)}{join '/', $1, $lookup{uc $1}}eig;
в зависимости от того, что вам нужно.
Кроме того, ysth указывает в комментариях: «С 5.10 и более поздними Regex :: PreSuf генерирует более регулярное выражение, чем наивное чередование в большинстве случаев» Итак,
my $re = join '|', map quotemeta, sort { length($b) <=> length($a) } keys %lookup;
может быть лучше. sort
необходим, если некоторые ключи могут быть начальными подстроками других ключей.