忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2203 | 回复: 5

如何使用 split 函数 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-29 00:42 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-09-29 08:53 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. while(<DATA>){
  5.     my ($c) = /\w(.)/;   
  6.     my @ary = split(/$c/);
  7.     print("$c:$ary[1]\n");
  8. }

  9. __DATA__
  10. a#b#c
  11. a|b|c
复制代码
输出结果:


能不能让 m/pattern/ 别那么智能,可以吗?

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. while(<DATA>){
  5.     my ($c, $mc) = map {$_, quotemeta($_)} /\w(.)/;
  6.     my @ary = split(/$mc/);
  7.     print("$c:$ary[1]\n");
  8. }

  9. __DATA__
  10. a#b#c
  11. a|b|c
复制代码
感觉有点啰嗦,大家有啥好办法 支一招,谢谢。


论坛徽章:
0
发表于 2017-09-29 15:42 |显示全部楼层
回复 1# sunzhiguolu

split special char only
perl -le '$s="ab#cd|ef-hi"; @ary=split(/[^A-Za-z]/, $s); print "@ary"'
ab cd ef hi

split letter only
perl -le '$s="ab#cd|ef-hi"; @ary=split(/[A-Za-z]/, $s); print "@ary"'
  #  |  -

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-29 19:31 |显示全部楼层
回复 2# ulmer
谢谢您的回复,感觉还是我没有将自己的意思表达清楚。
每一行的记录都采用分隔符进行分割 (可能每行之间的分隔符不同,但是记录间用来分割字段的分隔符不会发生变化)。
由于有些分隔符 恰好与 perl 正则中的某些元字符使用相同的字符 导致在 split 进行分割时 正则按照元字符的含义进行解析。
如:'|' 字符,我希望将每行记录中的分隔符取出,并按照该字符的字面含义 交给 split 函数进行处理。取出该字符的原因是在后面可能被用到。

论坛徽章:
45
15-16赛季CBA联赛之广夏
日期:2017-06-02 21:46:59天蝎座
日期: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-04-11 17:31:452015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2017-09-29 20:50 |显示全部楼层
你知道 quotemeta 不知道一个意思的 "\Q$c\E" ?   这是在正则表达式里插入字符串最严谨的方式,你用的没毛病

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-10-02 12:34 |显示全部楼层
你的代码已经快成汇编了,还要不啰嗦,就变成加密了。

代码如果要维护,就要尽量容易看懂,不单单是对别人,也是对自己。

split  函数的 分隔符号 可以是正则,是 Perl 独有的特点,研究的越多,就中毒越深。

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期: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
发表于 2017-10-02 23:24 |显示全部楼层
回复 1# sunzhiguolu

$ echo "1_2|3#4$" |
   perl -lane '{
      @data=split(/([\W_])/);
      @odd=map{$data[$_]}grep{$_%2==1}0..$#data;
      @even=map{$data[$_]}grep{$_%2==0}0..$#data;
      print "@even\n@odd\n"
  }'
1 2 3 4
_ | # $

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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP