免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1576 | 回复: 7

m??的问题 [复制链接]

论坛徽章:
0
发表于 2012-08-15 16:05 |显示全部楼层
本帖最后由 sjdy521 于 2012-08-15 16:06 编辑

最近看perldoc里的m??,然后就亲自实验了下,发现个和理解不符的情况,故发出来看下:
按照perldoc里的例子,写在while或者foreach里,只会匹配一次,需要reset再能继续匹配,这个没什么问题
  1. perl -le '$_="abc";for(0..3){print "match" if m?a*?}'
复制代码
输出:
  1. match
复制代码
但是,当我尝试不在循环里写的时候,比如:
  1. perl -le '$_="abc";print "match" if m?a*?;print "match" if m?a*?;'
复制代码
输出:
  1. match
  2. match
复制代码
两次都mactch了。。这点理解不了,望大家指点下

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
发表于 2012-08-15 16:17 |显示全部楼层
本帖最后由 cdtits 于 2012-08-15 16:21 编辑
  1. Web:~# perl -le '$_="abc";for(0..3){print "$_ match $1" if m?(a*)?;}'
  2. 0 match
  3. Web:~# perl -le '$_="abc";print "$_ match $1" if m?(a*)?; print "$_ match $1" if m?(a*)?;'
  4. abc match a
  5. abc match a
  6. Web:~#
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-08-15 16:24 |显示全部楼层
不在循环不就执行不了第二次不就没区别了。下面那明明就是两个不一样的匹配各自保存自己的属性不是很正常吗?

如果这个理解有障碍的话那那个 flip flop 肯定也理解不了吧

论坛徽章:
0
发表于 2012-08-15 17:53 |显示全部楼层
本帖最后由 sjdy521 于 2012-08-15 18:17 编辑

回复 3# zhlong8


    主要是m///g受g选项和pos()的影响,理解的时候是类比的猜测了。再加上有reset()的存在,我以为这个是m??自己维持的某种状态,被大家这么一说,稍微清醒了些
    关于Range Operator的那个,我看perldoc上有这么一句:
Each ".." operator maintains its own boolean state, even across calls to a subroutine that contains it
我也再重新去理解理解,多做些测试看看

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-08-15 19:48 来自手机 |显示全部楼层
我还没用过,看文档它就是个带状态的m// 和 pos 之间没什么特别关系

论坛徽章:
0
发表于 2012-08-15 22:33 |显示全部楼层
1. for (0..3) { ... } 中的 $_  是 0 1 2 3
a* 又是 a可有可无可多个
所以你的代码意义不明

2. for(0..3){print "match" if 'abc' =~ m?a?}   
结果只有一个 match

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-08-15 22:35 |显示全部楼层
看楼上才发现我好像错过了什么

论坛徽章:
0
发表于 2012-08-15 23:10 |显示全部楼层
@朱亭亭@zhlong8 那个for(0..3)是举的不够好,这样写吧
  1. perl -le 'for(0..3){$_="abc";print "match" if m?a*?}'
复制代码
不过问题还是可以表述清楚了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP