免费注册 查看新帖 |

Chinaunix

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

2个小问题,望解答 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-16 15:19 |只看该作者 |倒序浏览
1、有一文件:
abcdefg  \n
"mnop
怎么通过判断下一行开头是否为"号来删除当前行的换行符以及下一行的"号



2、split能否可以把固定字符长度做为分隔符,假设不行还有什么其他方法。

论坛徽章:
0
2 [报告]
发表于 2012-11-16 23:10 |只看该作者
1. 要在全文模式下匹配,也就是说文件读入一个带换行符的字符串。
  1. use File::Slurp qw(read_file);

  2. my $text = read_file $file;

  3. $text =~ s/^.*?^"//xmsg;
复制代码
2. split 可以使用Lookahead 向前看的正则定义固定长度的分隔符, 但分隔符号要占一个。
  1. my @array = split /(?=.{4}./, $str;
复制代码
也可以使用正则来匹配,而且不占用分隔符。
  1. my @array = $str =~ /(.{4})/g;
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-11-17 10:14 |只看该作者
本帖最后由 kk861123 于 2012-11-17 10:32 编辑

帖子乱了,请看下楼重新编辑的内容

论坛徽章:
0
4 [报告]
发表于 2012-11-17 10:23 |只看该作者
本帖最后由 kk861123 于 2012-11-17 10:26 编辑

奇怪,怎么乱了,重新编辑下:
1. 同意Perlvim,还是将字符串全部吃入后再处理方便。
2. 方法确实很多
1)split
使用环视在split中不能分割成固定的字符串的,字符串为abcdef,分割的后的效果将是a,b,cdef.暂时没发现好的方法来split,请大家不吝赐教。
2)正则
需要加一句判断,否则如上面的字符串,@array中只有abcd,而ef就丢失了
@array = $str =~ /(.{4})/g;
push @array, $' if $';
# 不知道编辑的帖子乱了是不是这里导致的问题?

3)substr
  1. my @array = ();
  2. for (my $i = 0; $i <= length($str); $i += 4) {
  3.     push @array, substr($str,$i,4);
  4. }
复制代码
4)filehand
暂时觉得这个方法也比较方便
  1. open my $fh, "<", \$str;
  2. my @array = do{ local $/=\4; <$fh> };
  3. close($fh);
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2012-11-17 13:33 |只看该作者
本帖最后由 mcshell 于 2012-11-17 13:34 编辑
kk861123 发表于 2012-11-17 10:23
奇怪,怎么乱了,重新编辑下:
1. 同意Perlvim,还是将字符串全部吃入后再处理方便。
2. 方法确实很多

每次看到眼镜哥都是code啊,拜膜中.....
正则可以这样。。

  1. my  $str='abcdef';
  2. 1 while($str =~/(.{1,4})(?{print "$1\n"})/g);
复制代码
贪婪匹配4个,不够4个的,有几个就匹配几个

论坛徽章:
0
6 [报告]
发表于 2012-11-17 15:05 |只看该作者
回复 5# mcshell


    good, thanks!

论坛徽章:
0
7 [报告]
发表于 2012-11-19 13:48 |只看该作者
谢谢大家,我试试!

论坛徽章:
0
8 [报告]
发表于 2012-11-19 15:41 |只看该作者
第一个问题用Slurp和sysread试了下,都是乱码阿!

论坛徽章:
0
9 [报告]
发表于 2012-11-19 19:02 |只看该作者
本帖最后由 perlnewbie 于 2012-11-19 19:03 编辑
  1. #!perl -w
  2. use strict;
  3. my $c;
  4. my $p = "";
  5. while( <> ){
  6.     $p = $c ;
  7.     $c = $_ ;
  8.     if( /^"/ ){
  9.         chomp $p
  10.         && $c =~ tr/"//d
  11.         && print $p.$c;
  12.     }
  13.     else{
  14.         print $c;
  15.     }
  16. }
复制代码
把你的数据文件,perl代码文件存为和命令行一样的编码就可了事
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP