正则替换中s///e 的“e”是什么意思?

正则替换中s///e 的“e”是什么意思?

查了资料,没看明白 ,请高人指点
再查


QUOTE:
原帖由 machine 于 2008-12-17 16:42 发表
查了资料,没看明白   

这个问题 perlop 关于 s/// 的部分说的还不够明白?
相当于把替换的表达式套在eval里 是吗?
比如:$x =~ s!(\d+)%!$1/100!e;
相当于:$x =~ s!(\d+)%!eval{$1/100}!e;

大骆驼:

/e 修饰词把 REPLACEMENT 当作一个 Perl 代码块,而不仅仅是一个替换的字串。执行这段代码后得出的结果当作替换字串使用。比如,s/(0-9)+)/sprintf("%#x", $1)/ge 将把所有数字转换成十六进制,比如,把 2581 变成 0xb23。或者,假设在我们前一个例子里,你不知道是否所有版本都有名称,因此,你希望把这些没有名称的保留不动。可以利用稍微有点创造力的 /x 格式,你可以说:


   s{
      version
      \s+
      (
         [0-9.]+
      )
   }{
      $Names{$1}
         ? "the $Names[$1} release"
         : $&
   }xge;
你的 s///e 的右边(或者本例中的下半部分)在编译时与你的程序的其他部分一起做语法检查和编译。在编译过程中,任何语法错误都会被检测到,而运行时例外则被忽略。在第一个 /e 后面每多一个 e(象 /ee,/eee 等等)都等效于对生成的代码调用 eval STRING,每个 /e 相当于一次调用。这么做等于计算了代码表达式的结果并且把例外俘获在特殊变量 $@ 里。参阅本章后面的“编程化模式”获取更多信息。
本人就是查大骆驼的这段话,不明白的 呵呵,后来看了perlop,觉得还简练一些。



QUOTE:
原帖由 machine 于 2008-12-17 17:16 发表
本人就是查大骆驼的这段话,不明白的 呵呵,后来看了perlop,觉得还简练一些。

用一用,自然就明白了
彻底明白了,呵呵 大骆驼讲的太深入了。像我这样搞perl时间不长的人看,反而看不太明白的说。

You may have seen the /e substitution modifier used to evaluate the replacement as code rather than as a string. It's designed for situations where you don't know the exact replacement value, but you do know how to calculate it. For example, doubling every whole number in a string:

$text = "I am 17 years old";
$text =~ s/(\d+)/2 * $1/eg;