我试图将单词类型作为输入文件(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);
但是我相信我做错了,因为我将输入文件本身作为输出。请帮我一些指示。提前致谢。
答案 0 :(得分:3)
你几乎是对的,Dada用他的评论指出了正确的方向。
模式/ing\s*$/
检查字符串'ing'
,后跟可选的空格(\s*
),然后检查行尾($
)。这与您的输入不符,因为例如'eating'
在该行结束前,有一个标签 和 字母V
。
您必须将该模式更改为/^\w*ing\b/
。这意味着
^
\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
。