Perl 如何从文件中以特定字符开头和结尾的节中删除某些停止字

Perl 如何从文件中以特定字符开头和结尾的节中删除某些停止字,perl,word,Perl,Word,我需要停止出现在.T&.B、.B&.A、.A&.N、.N&.X之间的文本中的单词。第一步是将每个块放入一个合适的数据结构中。下面的脚本就是这样做的。一旦有了%段,就可以根据需要修改和重新组合每个块 .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

我需要停止出现在.T&.B、.B&.A、.A&.N、.N&.X之间的文本中的单词。第一步是将每个块放入一个合适的数据结构中。下面的脚本就是这样做的。一旦有了
%段
,就可以根据需要修改和重新组合每个块

.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
#/usr/bin/env perl
严格使用;使用警告;
使用数据::转储程序;
我的%stops=map{$\=>1}qw(a全部在中);
运行(\*数据,\%停止);
分段{
我的$fh=班次;
我的$stops=shift;
本地$/='.I';
我的$pat=qr{
^[](?[0-9]+)\n
^[.]T\n(?.+)
^[.]B\n(?.+)
^[.]A\n(?.+)
^[.]N\N(?.+)
^[.]X\n(?.+)
}xms;
while(我的$chunk=){
咀嚼$chunk;
下一步,除非$chunk;
如果($chunk=~$pat){
我的%segments=%+;
打印转储程序\%段;
}
}
}

我不太确定你想要什么。如果我按照你的指示去做的话,似乎我把文件里的所有东西都删除了。你能解释一下你想要什么,或者给我们一个例子,说明程序完成后文件应该是什么样子的吗?我是perl新手,你能告诉我在哪里加载包含所有内容的文件吗?你打开文件,并将文件句柄作为第一个参数传递给
run
.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
#!/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;
        }
    }
}