- 论坛徽章:
- 0
|
本帖最后由 Perlvim 于 2012-03-26 00:35 编辑
- # -----------------------------------------------------------
- # 不使用 eval 执行正则替换表达式
- # ------------------------------------------------
- sub eval_replace_expression {
- my ($text, $pattern, $replace) = @_;
- # 将一个替换字符串中的数字引用变量改为参数引用变量
- my $iter = create_iter();
- $pattern =~ s/(?<!\\)\((?!\?)/$iter->()/ge;
- $pattern = qr/$pattern/xms;
- $replace =~ s/(?<!\\)\$(\d+)\b/\$+{__$1}/g;
- if ($text =~ /$pattern/) {
- while (my ($key, $value) = each %+) {
- $replace =~ s/(?<!\\)\$\+\{$key\}/$value/g;
- }
- }
- $text =~ s/$pattern/$replace/xmsg;
- return $text;
- }
- # ----------------------------
- # 创建一个迭代器用于正则表达式的处理
- # ----------------------------------
- sub create_iter {
- return sub {
- state $count = 1;
- my $replace = "(?<__$count>";
- $count++;
- return $replace;
- }
- }
复制代码 |
|