- 论坛徽章:
- 46
|
本帖最后由 zhlong8 于 2010-10-24 16:48 编辑
- 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;
复制代码 有bug不应该用 $. 已修正
测试数据- 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
复制代码 输出 |
|