请教一个识别后删除的问题
时间:2010-10-24
来源:互联网
11111
/begin a
22222
/end a
333333
/begin b
44444
/end b
555555
/begin a
66666
77777
/end a
探测到begin后的名字一样的话,就消除/begin到/end行之间的内容.比如上面的文件中删除
/begin a
66666
77777
/end a
一行的删除还有头绪,多行的删除有点没头绪了,
请高手指点!!!谢谢!!
/begin a
22222
/end a
333333
/begin b
44444
/end b
555555
/begin a
66666
77777
/end a
探测到begin后的名字一样的话,就消除/begin到/end行之间的内容.比如上面的文件中删除
/begin a
66666
77777
/end a
一行的删除还有头绪,多行的删除有点没头绪了,
请高手指点!!!谢谢!!
作者: yilong777jp 发布时间: 2010-10-24
本帖最后由 zhlong8 于 2010-10-24 16:48 编辑
复制代码
有bug不应该用 $. 已修正
测试数据
复制代码
输出
复制代码
- use 5.012;
- use warnings;
-
- my %tags; #为 key => [行号1, 行号2, 行号3,...]结构
- my @result;
- my $line = -1;
-
- while (<>) {
- chomp;
- push @result, $_;
- $line ++;
- if (m!^/begin (\w+)!) { #记录行号
- exists $tags{$1} ? push(@{$tags{$1}}, $line) : ($tags{$1} = [$line]);
- next;
- }
-
- if (m!^/end (\w+)!) { #寻找匹配行号并删除,
- #不支持 \begin a \begin b \end a \end b这样的交叉结构
- die "not match" unless exists $tags{$1} and @{$tags{$1}};
- splice @result, (pop @{$tags{$1}})-1, $#result; #行号从1 开始,所以要减 1
- $line = $#result;
- next;
- }
- }
- say for @result;
测试数据
- 11111
-
- /begin a
- 22222
- /begin c
- 324333
- 324234
- /end c
- /end a
-
- 333333
-
- /begin b
- 44444
- /end b
-
- 555555
- /begin a
- 66666
- 77777
- /end a
- 11111
-
- 333333
-
- 555555
作者: zhlong8 发布时间: 2010-10-24
回复 yilong777jp
复制代码
txt 就是楼主提供的文件,不支持嵌套。
- perl -lnE '
- if (m#/begin (\w+)# .. m#/end ($1)#) {
- say unless $hash{$1};
- m#/end (\w+)# and $hash{$1} = 1;
- } else {
- say;
- }' txt
作者: Monox 发布时间: 2010-10-24
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28