m//在列表上下文中的返回值问题

m//在列表上下文中的返回值问题



[Copy to clipboard] [ - ]
CODE:
Mail:~# perl -e '$_="OneoNeonE";@line=m/(one)*/gi;print "@line\n"'  |cat -A
onE $


Mail:~# perl -e '$_="OneoNeonE";@line=m/(one)/gi;print "@line\n"'  |cat -A
One oNe onE$


Mail:~# perl -e '$_="OneoNeonE";@line=m/(one)/i;print "@line\n"'  |cat -A
One$


Mail:~# perl -e '$_="OneoNeonE";@line=m/(one)*/i;print "@line\n"'  |cat -A
onE$



请问下为什么第一条和最后一条的结果不是:OneoNeonE$
谢谢
晕,老是有图标.....

[Copy to clipboard] [ - ]
CODE:
perl -e '$_="OneoNeonE";@line=m/((?:one))*/i;print "@line\n"'

??
简单的说,你第一句只匹配了一次整个语句就配完了,()里的是onE,最后一句同理

学习了!


QUOTE:
原帖由 smonkey0 于 2008-4-15 23:13 发表
简单的说,你第一句只匹配了一次整个语句就配完了,()里的是onE,*匹配了oNeonE
最后一句同理

谢谢你的回复
()里为什么是onE?
第一句返回2个值,@line有2个元素
对不起没看清楚...
这个问题应该涉及到匹配的顺序,以前好像看到过,大致应该是这样的.
当涉及的贪婪匹配时,如* ,+ 匹配的顺序是逆向的,如第一句语句,
所以OneoNeonE应该是从onE开始配,当发现onE配上,所以@line里存入一个onE, 然后指针会再从最后到onE间的东西寻找是否有匹配的东西,但发现没了,所以第二次配为空,@line存入一个undef,
但如果不是贪婪匹配时,如?,指针的匹配是顺向的,即OneoNeonE,会从One开始匹配到最后.

如有错误,请误见怪
从后匹配?

还是没有理解!


QUOTE:
原帖由 andy820303 于 2008-4-16 09:05 发表
从后匹配?

还是没有理解!



[Copy to clipboard] [ - ]
CODE:
Mail:~# perl -e '$_="OneoNeonE";@line=m/(one)*/gi;print "@line\n"'  |cat -A
onE $

这句加不加/g都是一样的
因为你(one)*这个本身已经把$_的全部内容给匹配了,无所谓再次匹配,/g有没有都一样
你可以试着改成下面的样子就可以看出区别来了

[Copy to clipboard] [ - ]
CODE:
perl -e '$_="OneseehereoNeonE";@line=m/(one)*/gi;print "@line\n"'  |cat -A

这个时候加不加/g就有区别了
我也没明白