这不是一个“简单”的问题,所以不要自责。
问题在于,对于单个/e
, RHS 被理解为其eval
'd 结果用于替换的代码。
那个 RHS 是什么?是$1
。如果您进行了评估$1
,您会发现包含该字符串 $var
。它不包含所述变量的内容,只是 $
后跟 av
后跟 ana
后跟 an r
。
因此,您必须对其进行两次评估,一次$1
变成$var
,然后再次将之前的结果$var
变成字符串"testing"
。您可以通过在operatoree
上使用 double修饰符来做到这一点。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.