免费注册 查看新帖 |

Chinaunix

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

关于split 的捕获括号,理解不能 请教下老司机 [复制链接]

论坛徽章:
0
发表于 2014-11-16 19:28 |显示全部楼层
As with regular pattern matching, any capturing parentheses
that are not matched in a "split()" will be set to "undef" when
returned:

       @fields = split /(A)|B/, "1A2B3";
       # @fields is (1, 'A', 2, undef, 3)

在split的man文档最后有这样一段话,简单翻译下:作为正则表达式匹配,
任何在split()中没有匹配的捕获括号,将会被设成undef,然后返回。这个东西
是怎么理解的?

这是我实验的结果,哪位老司机能指点下,多谢!
Administrator@SWYWXQ1DHSU3MJ6 ~
$  perl -e '@fields = split /(A)|B/, "1A2B3"; print join "--", @fields'
1--A--2----3
Administrator@SWYWXQ1DHSU3MJ6 ~
$ perl -e '@fields = split /(A)|(B)|C/, "1A2BC3"; print join "--", @fields'
1--A----2----B--------3

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2014-11-16 20:13 |显示全部楼层
回复 1# 45177659

1. without capture
$ perl -le '@fields = split /A|B|C/, "1A2B3C4"; print join ",", @fields'
1,2,3,4

2. capture together
$ perl -le '@fields = split /(A|B|C)/, "1A2B3C4"; print join ",", @fields'
1,A,2,B,3,C,4

usually, we don't use follow ways:
$ perl -le '@fields = split /(A)|B|C/, "1A2B3C4"; print join ",", @fields'
1,A,2,,3,,4

$ perl -le '@fields = split /A|(B)|C/, "1A2B3C4"; print join ",", @fields'
1,,2,B,3,,4

$ perl -le '@fields = split /A|B|(C)/, "1A2B3C4"; print join ",", @fields'
1,,2,,3,C,4

$ perl -le '@fields = split /(A)|(B)|C/, "1A2B3C4"; print join ",", @fields'
1,A,,2,,B,3,,,4

$ perl -le '@fields = split /(A)|(B)|(C)/, "1A2B3C4"; print join ",", @fields'
1,A,,,2,,B,,3,,,C,4

论坛徽章:
0
发表于 2014-11-16 20:23 |显示全部楼层
回复 2# jason680

i see! thanks


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-11-17 11:09 |显示全部楼层
本帖最后由 flw 于 2014-11-19 10:22 编辑

转载一下。
  1. 发信人: flw (还没想好), 信区: Perl
  2. 标  题: Re: 不得不说,perl太需要记忆了
  3. 发信站: 水木社区 (Thu Jul  5 23:06:32 2012), 转信

  4. 这个就是捕获的意思。

  5. @F = split $R, $S 类似于下面的代码(不论带不带括号、哪里带括号、带几个括号):

  6. while( @s = $S =~ $R ){
  7.     push @F, 转载一下。;
  8.     push @F, @s;
  9.     $S = ;
  10. }

  11. push @F, $S;

  12. 由此可见,split 里的正则表达式捕获和普通的正则表达式捕获用法是完全一致的。

  13. 【 在 arp (@arp) 的大作中提到: 】
  14. : 怎么一样啊。
  15. : 明显不一样啊。
  16. : ()在正则表达式捕获里面是group
  17. : ()在这里哪里有group的意思啊?
复制代码

论坛徽章:
0
发表于 2014-11-18 18:49 |显示全部楼层
回复 4# flw

    push @F, 转载一下。;
    push @F, @s;
    $S = ;


有点看不懂啊,没抄错吧 版主
   

论坛徽章:
1
狮子座
日期:2014-02-25 09:46:33
发表于 2014-11-19 09:40 |显示全部楼层
跟着大神学代码~~~回复 2# jason680


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-11-19 10:22 |显示全部楼层
尼玛,不知道怎么触发了论坛的隐藏功能,
我编辑了还是改不过来。

看这里吧:

http://www.newsmth.net/bbscon.php?bid=226&id=61643

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2014-11-19 10:51 |显示全部楼层
@flw @45177659

  这个就是捕获的意思。

@F = split $R, $S 类似于下面的代码(不论带不带括号、哪里带括号、带几个括号):

while( @s = $S =~ $R ){
    push @F, $`;
    push @F, @s;
    $S = $';
}

push @F, $S;

论坛徽章:
0
发表于 2014-11-20 20:00 |显示全部楼层
回复 8# jason680

有理有据,令人信服!:wink:

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP