这不完全是一个“简单”的问题,所以不要打垮自己。
问题在于,对于单个/e
,RHS被理解为其代码为eval
的结果用于替换。
什么是RHS?这是$1
。如果您评估为$1
,则会发现包含的字符串为$var
。它不包含所述变量的内容,只是$
后跟v
后跟a
后跟r
。
因此必须两次对其进行评估,一旦转成$1
$var
,然后再次打开的$var
先前的结果为字符串"testing"
。你可以通过s
operator上的双ee
修饰符来实现。
你可以用一个/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.
注意,“E”是不是一个正则表达式修改,因为它不影响正则表达式!它只影响更换零件。所以“e”修改s ///运算符,而不是正则表达式。 – tadmc 2011-05-21 15:16:24