Это не совсем «простой» вопрос, так что не мучайте себя.
Проблема в том, что с одним /e
RHS понимается как код, для которого eval
'dрезультат используется для замены.
Что это за RHS?Это $1
.Если вы оценили $1
, вы обнаружите, что содержит строку $var
.Он не содержит содержимого указанной переменной, просто $
, за которым следует v
, затем a
и r
.
Поэтому вы должны оценить его дважды, один раз, чтобы превратить $1
в $var
, затем снова, чтобы превратить предыдущий результат $var
в строку "testing"
.Это можно сделать, применив модификатор double ee
к оператору s
.
. Вы можете легко проверить это, запустив его с одним /e
против двух из них.Вот демонстрационный пример обоих, плюс третий способ, который использует символьную разыменование - который, поскольку он ссылается на таблицу символов пакета, работает только с переменными пакета.
use v5.10;
our $str = q(In this string we are $var the "e" modifier.);
our $var = q(testing);
V1: {
local $_ = $str;
s/(\$\w+)/$1/e;
say "version 1: ", $_;
}
V2: {
local $_ = $str;
s/(\$\w+)/$1/ee;
say "version 2: ", $_;
}
V3: {
no strict "refs";
local $_ = $str;
s/\$(\w+)/$$1/e;
say "version 3: ", $_;
}
При запуске это приводит к:
version 1: In this string we are $var the "e" modifier.
version 2: In this string we are testing the "e" modifier.
version 3: In this string we are testing the "e" modifier.