почему это не работает, когда я хочу заменить текст, используя хэш-ключи и функцию соединения? - PullRequest
0 голосов
/ 01 июля 2018

Я написал такую ​​программу на Perl:

#program1
$sentence = "dog cat";
%replacememts = ("dog" => "wolf","cat" => "tiger");
($val = $sentence) =~ s/(join "|",keys %replacements)/$replacements{$1}/g;
print "$val\n";

Будет напечатано "Собачья кошка" . Это не тот ответ, который я хочу. Но при добавлении анонимного массива и массива разыменования вот так:

#program2
$sentence = "dog cat";
%replacememts = ("dog" => "wolf","cat" => "tiger");
($val = $sentence) =~ s/(@{[join "|",keys %replacements]})/$replacements{$1}/g;
print "$val\n";

Будет напечатано "Волчий тигр" . Это ответ, который я хочу. Зачем? Чем отличается программа 1 от программы 2? кто-то может сказать мне, спасибо!

1 Ответ

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

Ну, во-первых, вы определяете %replacememts и пытаетесь использовать %replacements. Вот почему вы должны всегда use strict и use warnings 'all' наверху каждой написанной вами Perl-программы без исключения. Затем вам нужно будет объявить каждую из ваших переменных с my как можно позже (не просто помещать большой блок объявлений вверху)

В конце концов, у вас правильная идея, но первым параметром для подстановки должен быть шаблон регулярного выражения. Он будет интерполировать переменные Perl, поэтому он работал, когда вы использовали массив, но вы не можете просто использовать произвольное выражение Perl

Вам необходимо встроить шаблон регулярных выражений в переменную и использовать эту переменную в подстановке. Как это. Так же намного понятнее

use strict;
use warnings 'all';

my $sentence = 'dog cat';

my %replacements = ( dog => 'wolf', cat => 'tiger' );

my $re = join '|', keys %replacements;

(my $val = $sentence) =~ s/($re)/$replacements{$1}/g;

print "$val\n";

выход

wolf tiger
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...