Perl程序将单词类型作为输出

时间:2016-06-23 15:49:26

标签: perl pattern-matching

我试图将单词类型作为输入文件(input.txt)的输出,看起来像这样,

输入文件

John    N   N
loved   V
Mary    N   N
.   S

He  N
was V
eating  V
in  P   P
a   A   A
restaurant  N
.   S

The A   A
cats    N   N
killed  V
the A   A
rats    N   N
 .  S

I   N
am  V
playing V
.   S

输入文件有三列。第一列是单词,接下来的两列是单词类型。所有列都由制表符分隔,中间有空行。  该计划的目标是匹配诸如" ing"," ed"和" s"并在第四列中打印单词类型。预期的输出将是

预期输出

John    N   N
loved   V       V
Mary    N   N
.   S

He  N
was V
eating  V       V
in  P   P
a   A   A
restaurant  N
.   S

The A   A
cats    N   N   N
killed  V       V
the A   A
rats    N   N   N
.   S

I   N
am  V
playing V       V
.   S

我正在使用的代码就是这个,

!/usr/bin/perl
use warnings;
use strict;

open my $fh, '<' , 'input.txt' or die $!;
while (<$fh>) {
    chomp ;
    print $_;
    if (/ing\s*$/ or /ed\s*$/) {
        print '  V';
    } 
    if (/s\s*$/) {
        print '  N';
    }
    print "\n";
    }
close($fh);

但是我相信我做错了,因为我将输入文件本身作为输出。请帮我一些指示。提前致谢。

1 个答案:

答案 0 :(得分:3)

你几乎是对的,Dada用他的评论指出了正确的方向。

模式/ing\s*$/检查字符串'ing',后跟可选的空格(\s*),然后检查行尾($)。这与您的输入不符,因为例如'eating'在该行结束前,有一个标签 字母V

您必须将该模式更改为/^\w*ing\b/。这意味着

  • 开始行^
  • 一些可选的单词字符(如a-z,0-9)\w*
  • 字符串'ing'
  • 字边界,即从字母到非字母\b
  • 的变化

脚本:

#!/usr/bin/env perl

use strict;
use warnings;

open my $fh, '<', 'input.txt' or die $!;
while (<$fh>) {
    chomp;
    print $_;
    if ( /^\w*ing\b/ or /^\w*ed\b/ ) {
        print "\tV";
    }
    if (/^\w*s\b/) {
        print "\tN";
    }
    print "\n";
}
close($fh);

这给几乎所需的输出但在'was'处失败:它以s结束,因此被视为名词,但这是一个不同的问题:

John    N   N
loved   V   V
Mary    N   N
.   S

He  N
was V   N
eating  V   V
in  P   P
a   A   A
restaurant  N
.   S

The A   A
cats    N   N   N
killed  V   V
the A   A
rats    N   N   N
 .  S

I   N
am  V
playing V   V
.   S

Btw:Dada's suggestion给出相同的结果。他提出了/^\w*ing\s/模式,而不是我的/^\w*ing\b/,这也适用,因为在'ing'之后,您的输入中始终有一个空格\s