我有一个文本文件,我们称之为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
我知道我做错了什么。任何提示或建议将不胜感激。提前谢谢!
答案 0 :(得分:2)
我不清楚你的代码在做什么。例如,%word_match
散列的重点是什么?为什么你评论了use strict
和use 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
,构建哈希的循环,以及对哈希的测试,我认为这是最好的方法。它将按照您自己的代码处理每行多个单词,并且还避免了在正则表达式模式中允许空格的需要
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
|