Как искать и заменять (заменять), используя ключи и значения хеша - PullRequest
1 голос
/ 06 октября 2011

Я думаю, что моя проблема очень похожа на эту: Как использовать переменную на стороне замены оператора подстановки Perl? Разница в том, что $ find и $ replace - это ключи и значенияхеш, который я использую.

while(($find,$replace) = each %hash){
$string_to_check =~ s/$find/$replace/e;
}

Вот пример для одной пары пары ключ-значение в моем хеше

ключ: ^ / abc (/.*)?$

значение: www.abc.website.com $ 1

Я получаю подстановку здесь, но $ 1 не будет заменен содержимым (/.*)

Сs /// ee вместо s /// e, я получаю:

Bareword found where operator expected at (eval 1) line 1, near "//xyz"
(Missing operator before xyz?)
Use of uninitialized value in substitution iterator at ./script line 46, <FH1> line 3470.

... и, следовательно, соответствующие части заменяются пустой строкой.

Я предполагаю,что

while(($find,$replace) = each %hash)

не будет действовать так же, как одиночные кавычки в первом ответе на другой вопрос в теме, с которой я связан:

$replace='"foo $foo bar"';

Это правильно?

Извините за мой английский и заранее спасибо за вашу помощь.(Я новичок в Perl и программировании в целом.)

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Чтобы оценить $ 1, хранящийся в $ replace, вам нужно будет использовать eval.Обратите внимание, что eval может представлять угрозу безопасности, поэтому убедитесь, что вы контролируете содержимое %hash.

while (my ($find, $replace) = each %hash) {
    eval "\$string_to_check =~ s{$find}{$replace}";
}
0 голосов
/ 06 октября 2011

Вместо $1 при замене используйте \1. Это обратная ссылка на первую подобранную группу. Я думаю, что в этом случае вы также можете полностью сбросить /e.

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