Perl интерпретирует регулярные выражения из текстового файла - PullRequest
0 голосов
/ 02 июля 2018

Я новичок в Perl, и у меня есть вопрос о регулярных выражениях. Цель сценария, над которым я работаю, состоит в том, чтобы заменить строку другой в файле XML. Эти строки находятся в текстовом файле, который выглядит следующим образом:

mot-clé, mot clé
noeud, nœud
version (\d), version (\d)
Codename One, Codename One

Сценарий берет каждую строку этого файла и помещает их в хеш-таблицу, а затем ключ заменяется его значением:

# Open file text and recupration of the lines in a table @t
%hach = @t;
foreach my $k (keys(%hach)) {
   s/$k/$hach{$k}/sg;
}

Замены сделаны в XML-файле. Например, перед запуском скрипта он выглядит так:

<title>Codename One</title>
<para>Le mot-clé de la version 3 .....</para>
<para> .... noeud .... </para>

Мне бы хотелось, чтобы после прохождения скрипта это выглядело так:

<title>Codename&#8201;One</title>
<para> Le mot clé de la version&#8201;3 .....</para>
<para> .... nœud .... </para>

В данный момент подстановка выполняется для "обычных" строк, но не для строк, содержащих регулярное выражение. Для этих строк я хотел бы, чтобы perl интерпретировал символы, связанные с регулярным выражением. Затем скрипт сможет сделать все замены. Вот мой вопрос: может ли Perl интерпретировать эти строки как регулярные выражения? И если это возможно, то как?

Заранее спасибо!

1 Ответ

0 голосов
/ 02 июля 2018

Необходимо различать текстовые ключи и ключи регулярных выражений в коде. Для ключей регулярных выражений используйте подстановку с двойным вычислением, а также обратные ссылки в соответствующих значениях, если есть группы захвата.

use 5.026;
use Tie::RefHash;
use strictures;

my %subst;
tie %subst, 'Tie::RefHash';
%subst = (
    'mot-clé' => 'mot clé',
    noeud => 'nœud',
    qr'version (\d)' => 'version&#8201;$1',
    'Codename One' => 'Codename&#8201;One',
);

my $text = <<'';
<title>Codename One</title>
<para>Le mot-clé de la version 3 .....</para>
<para> .... noeud .... </para>

foreach my $k (keys %subst) {
    if (ref $k eq ref qr'') {
        $text =~ s/$k/qq("$subst{$k}")/eegms;
    } else {
        $text =~ s/$k/$subst{$k}/gms;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...