0
.我 1
.T
爱丽丝漫游仙境
她突然跟着它穿过兔子洞
她走了很长一段路,来到一个奇怪的大厅,里面有许多大小不一的锁着的门。
她发现一把小钥匙打开了一扇小到她无法通过的门。
.B
CACM 狼狗 1958 年 12 月
。一种
玻璃市,AJ
萨梅尔森,K.
.N
CA581203 JB 1978 年 3 月 22 日晚上 8 点 28 分
。X
100 5 1
123 5 1
164 5 1
.I 2
.T
数字计算机的重复减法求根
其中的内容导致她缩小得太小而无法触及钥匙
她留在了桌子上。
一个上面写着“吃我”的蛋糕让她长大。
.B
CACM 1958 年 12 月
。一种
苏盖,I.
.N
CA581202 JB 1978 年 3 月 22 日晚上 8 点 29 分
。X
2 5 2
2 5 2
2 5 2

现在上面的文本是2个文件的内容,新文件从.I开始(后跟一个数字)我需要在.T&.B,.B&.A,.A&.N之间的文本中停止, .N &.X 并删除 .X 和新文档开头之间的所有文本。即.I(后跟一个数字)

“输出应该看起来像”

.I 1
.T
Alice wonderland
follows rabbit hole suddenly 
falls long way curious hall locked doors sizes 
door small fit through
.B
CACM wolf dog December, 1958
.A
Perlis, A. J.
Samelson,K.
.N
CA581203 JB March 22, 1978  8:28 PM
.X
.I 2
.T
Extraction Roots Repeated Subtractions Digital Computers
contents cause shrink
left table
cake with EAT causes grow
.B
CACM December, 1958
.A
Sugai, I.
.N
CA581202 JB March 22, 1978  8:29 PM
.X

我需要对出现在 .T 和 .B 、 .B 和 .A 、 .A 和 .N 、 .N 和 X 之间的文本进行停词

4

1 回答 1

0

第一步是将每个块放入一个体面的数据结构中。下面的脚本就是这样做的。拥有%segments后,您可以根据需要修改和重新组合每个块。

#!/usr/bin/env perl

use strict; use warnings;
use Data::Dumper;

my %stops = map { $_ => 1 } qw(a all of in);
run(\*DATA, \%stops);

sub run {
    my $fh = shift;
    my $stops = shift;

    local $/ = '.I';

    my $pat = qr{
        ^[ ] (?<I> [0-9]+) \n
        ^[.] T \n (?<T> .+)
        ^[.] B \n (?<B> .+)
        ^[.] A \n (?<A> .+)
        ^[.] N \n (?<N> .+)
        ^[.] X \n (?<X> .+)
    }xms;

    while (my $chunk = <$fh>) {
        chomp $chunk;
        next unless $chunk;

        if ($chunk =~ $pat) {
            my %segments = %+;
            print Dumper \%segments;
        }
    }
}
于 2012-04-13T05:04:54.117 回答