搜索以' ing'结尾的单词来自perl中的文本文件

时间:2016-06-19 09:56:21

标签: regex perl pattern-matching

我有一个文本文件,我们称之为file1.txt:

cats
and
dogs
are
running
around
|

john
loves
mary
|

I
am
swimming 
|

我正在尝试构建一个程序,该程序会查找以' ing'结尾的单词。并在同一文件或不同的output.txt文件旁边打印CC。

期望输出

cats
and
dogs
are
running  CC
around
|

john
loves
mary
|

I
am
swimming CC
|

我浏览了论坛中的可用文章并尝试构建以下代码,但是它给了我一个随意的结果,每个单词后跟" CC"。

use warnings;
use strict;

my $file = 'file1.txt';

open(my $word_fh,"file1.txt") or die "Couldn't open file file1.txt, $!";

my %word_match = map {chomp $_; $_ => 0} <$word_fh>;

close $word_fh;


open my $fh, '<', $file or die $!;

while (<$fh>){
    chomp;

    my @words_in_line = split;

    for my $word (@words_in_line){

        $word =~ /ing$/;
        $word .= '  CC' if exists $word_match{$word};

         print "    $word\n";
    }
    }

我得到的输出是:

cats    CC
and CC
dogs    CC
are CC
running CC
around  CC
|   CC
john    CC
loves   CC
mary    CC
|   CC
I   CC
am  CC
swimming
|   CC

我知道我做错了什么。任何提示或建议将不胜感激。提前谢谢!

3 个答案:

答案 0 :(得分:2)

我不清楚你的代码在做什么。例如,%word_match散列的重点是什么?为什么你评论了use strictuse warnings

你似乎过度思考这个问题,因为这对我来说似乎很简单。

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

while (<>) {
  chomp;
  $_ .= ' CCC' if /ing$/;
  print "$\n";
}

这是一个Unix风格的过滤器。它从STDIN读取并写入STDOUT。所以,(假设它在一个名为cccing的文件中)你会这样称呼它:

$ ./cccing < your_input.txt > your_output.txt

答案 1 :(得分:0)

那是因为你正在阅读你的file1.txt两次并检查它们是否匹配。如果file1.txt的当前行也包含在file1.txt中的某个位置,则在while循环中打印“CC”。由于它们是相同的文件,因此始终为真,并在每行之后打印“CC”。

您可能受到this question的启发,其中OP想要检查文件A中的单词是否也包含在文件B中。您的情况不同,因为您没有两个文件。

将file1.txt的第一个读取放入%word_match并迭代该文件一次。您的行$word =~ /ing$/;仅检查$word是否以ing结尾,但会将结果抛弃。这就像写作

$i > 5;
print "i is greater than 5\n";

您必须将其更改为

if ( $i > 5 ) {
    print "i is greater than 5\n";
}

总之,这给出了

#!/usr/bin/env perl

use strict;
use warnings;

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

答案 2 :(得分:0)

正如其他人所评论的那样,您使用散列%word_match来测试文件中的每个单词是否都存在于同一个文件中。当然,对于每个单词都是如此,所以你得到CC附加到所有单词

删除第一个open,构建哈希的循环,以及对哈希的测试,我认为这是最好的方法。它将按照您自己的代码处理每行多个单词,并且还避免了在正则表达式模式中允许空格的需要

Perl代码

use strict;
use warnings;

my $file = 'file1.txt';

open my $fh, '<', $file or die $!;

while ( <$fh> ){
    chomp;

    my @words_in_line = split;

    for my $word ( @words_in_line ) {

        $word .= ' CC' if $word =~ /(?:ing|s)$/;
    }

    print "    @words_in_line\n";
}

输入

cats
and
dogs
are running around
|

john loves mary
|

I
am
swimming 
|

输出

cats CC
and
dogs CC
are running CC around
|

john loves CC mary
|

I
am
swimming CC
|