免费注册 查看新帖 |

Chinaunix

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

问个split的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-21 20:24 |只看该作者 |倒序浏览
为什么
split /(-)|(,)/, "1-10,20";
返回结果是
(1, '-', undef, 10, undef, 20);
想了很久没想通
请高手给个解释,谢谢

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-12-21 20:26 |只看该作者
请改用
split(/[-|,]/,"1-10,20");
试试看...加上[]变成选一个...

论坛徽章:
0
3 [报告]
发表于 2006-12-21 20:36 |只看该作者

回复 2楼 apile 的帖子

该成split(/[-|,]/,"1-10,20")应该是以-或,为PATTERN吧
我想知道,为什么上边代码的结果那么奇怪,这些代码是Perl语言学习(第三版中文版)中的

论坛徽章:
0
4 [报告]
发表于 2006-12-21 21:23 |只看该作者
原帖由 undeadboy 于 2006-12-21 20:36 发表
该成split(/[-|,]/,"1-10,20")应该是以-或,为PATTERN吧
我想知道,为什么上边代码的结果那么奇怪,这些代码是Perl语言学习(第三版中文版)中的


Ref. to perldoc -f split

split /PATTERN/,EXPR,LIMIT

Here is regular expression, in your case regex operator "|" (=or)
or string classing "[]" both can be used.
i.e.:
perl -le '@a=split /[-,]/, "1-10,20";print "@a"'
# out: 1 10 20
  or
pperl -le '@a=split /-|,/, "1-10,20";print "@a"'
# out: 1 10 20

--ulmer

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-12-22 08:37 |只看该作者
split /(-)|(,)/, "1-10,20";
稍微试一下..就可以发现..有加()...与没加()...差别很大.....
应该是() 也被当成pattern了....
很抱歉..昨天晚上在家没有perl的环境..没试代码就贴上来...

论坛徽章:
0
6 [报告]
发表于 2006-12-23 15:44 |只看该作者

回复 5楼 apile 的帖子

呵呵,我一直对这个re很迷茫,到现在还没明白

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2006-12-23 16:37 |只看该作者
这个其实在 perldoc -f split 里已经说得很清楚了。
  1. If the PATTERN contains parentheses, additional list elements
  2. are created from each matching substring in the delimiter.
复制代码

如果 PATTERN 包含有圆括号,那么就会创建额外的列表元素,这些列表元素就是分隔符中,圆括号捕捉到的值。
如果没有圆括号,那么 split /-|,/, "1-10,20" 返回的是 1 10 20,如果有了圆括号,那么返回的就是 1 $1 $2 10 $1 $2 20 了,而 $1 $2 在两次匹配中分别等于 - undef 和 undef , 。

何伟平翻译的《Perl 语言编程》也说了:
  1. 我们早先说过分隔符不会被返回,但是如果 PATTERN 包含圆括弧,那么每一对圆括弧匹配的子字串都会包括在结果列表中,分散在那些平常返回的域之中。下面是一个简单的例子:


  2.    split /([-,])/, "1-10,20";
  3. 生成列表:


  4.    (1, '-', 10, ',', 20)
  5. 如果有更多圆括弧,那么为每个圆括弧对返回一个域,即使有些圆括弧对没有匹配也如此,这种情况下,为那些位置返回未定义数值。因此,如果你说:


  6.    split /(-)|(,)/, "1-10,20";
  7. 那么结果是:


  8.    (1, '-', undef, 10, undef, 20);
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-12-23 17:23 |只看该作者

回复 7楼 flw 的帖子

明白了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP