免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2641 | 回复: 8
打印 上一主题 下一主题

正则替换中s///e 的“e”是什么意思? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-17 16:42 |只看该作者 |倒序浏览
查了资料,没看明白 :wink: ,请高人指点

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-12-17 16:43 |只看该作者
再查

论坛徽章:
0
3 [报告]
发表于 2008-12-17 16:47 |只看该作者
囧 :wink:

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2008-12-17 16:56 |只看该作者
原帖由 machine 于 2008-12-17 16:42 发表
查了资料,没看明白 :wink:  

这个问题 perlop 关于 s/// 的部分说的还不够明白?

论坛徽章:
0
5 [报告]
发表于 2008-12-17 16:58 |只看该作者
相当于把替换的表达式套在eval里 是吗?
比如:$x =~ s!(\d+)%!$1/100!e;
相当于:$x =~ s!(\d+)%!eval{$1/100}!e;

[ 本帖最后由 machine 于 2008-12-17 17:19 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2008-12-17 17:06 |只看该作者

回复 #1 machine 的帖子

大骆驼:

/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 相当于一次调用。这么做等于计算了代码表达式的结果并且把例外俘获在特殊变量 $@ 里。参阅本章后面的“编程化模式”获取更多信息。

论坛徽章:
0
7 [报告]
发表于 2008-12-17 17:16 |只看该作者
本人就是查大骆驼的这段话,不明白的 呵呵,后来看了perlop,觉得还简练一些。

[ 本帖最后由 machine 于 2008-12-17 17:17 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-12-18 09:49 |只看该作者
原帖由 machine 于 2008-12-17 17:16 发表
本人就是查大骆驼的这段话,不明白的 呵呵,后来看了perlop,觉得还简练一些。



用一用,自然就明白了

论坛徽章:
0
9 [报告]
发表于 2008-12-18 10:58 |只看该作者
彻底明白了,呵呵 大骆驼讲的太深入了。像我这样搞perl时间不长的人看,反而看不太明白的说。:wink:

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;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP