2016-11-17 8 views
1

このコードブロックの調整には助けが必要です。すべてが機能していましたが、作業を中断し、毎回失敗します(印刷物)。私は間違って何をしていますか?'if'ステートメントでの提案が必要

print "Enter a word to search for:"; 
chomp (my $word = <STDIN>); 
if (not -e $word){ 
     print "No such word found.\n"; 
     exit; 
} 

全体プログラム。

#!/usr/bin/perl -w 


use strict; 


print "Welcome to the word frequency calculator.\n"; 
print "This program prompts the user for a file to open, \n"; 
print "then it prompts for a word to search for in that file,\n"; 
print "finally the frequency of the word is displayed.\n"; 
print " \n"; 


print "Please enter the name of the file to search:"; 
chomp (my $filename = <STDIN>); 
if (not -e $filename){ 
     print "No such file exists. Exiting program. Please try again. 
+\n"; 
     exit; 
} 


print "Enter a word to search for:"; 
chomp (my $word = <STDIN>); 
if (not -e $word){ 
     print "No such word found.\n"; 
     exit; 
} 


print "Frequency of word: " . grep $word eq $_, 
split /\W+/i, do { local (@ARGV, $/)= $filename; <> }; 


exit; 
+2

あなたはその行に何を期待していますか?文脈上意味をなさないファイルが存在しないかどうかを調べるためです。そして、その「分割」は、ファイルから単語を読み込む本当に奇妙な方法です...もしそれが全く機能していれば。 – Schwern

+1

http://www.perlmonks.org/?node_id=1176031 – choroba

答えて

5
print "Welcome to the word frequency calculator.\n"; 
print "This program prompts the user for a file to open, \n"; 
print "then it prompts for a word to search for in that file,\n"; 
print "finally the frequency of the word is displayed.\n"; 
print " \n"; 

ので、それによると、このプログラムは...

  1. は、検索するファイルをユーザーに要求します。
  2. 検索する単語をユーザーに教えてください。
  3. その単語がそのファイルにどのくらい含まれているかを確認してください。

あなたは最初の部分がダウンしています。

print "Please enter the name of the file to search:"; 
chomp (my $filename = <STDIN>); 
if (not -e $filename){ 
     print "No such file exists. Exiting program. Please try again.\n"; 
     exit; 
} 

それはdie代わりのprint + exitを使用することにより、より簡潔にビットを行うことができますが。そして、一般に、ファイルが存在するかどうかを調べるのではなく、単にファイルを開こうとするべきです。ファイルは存在する可能性がありますが、読み取りはできません。または、にチェックを入れて、後でそれを開こうとすると削除されると、が存在する可能性があります。

print "Please enter the name of the file to search: "; 
chomp (my $filename = <STDIN>); 
open my $fh, "<", $filename or die "Sorry, couldn't open $filename because $!"; 

次に、2番目のビットについては、単語を入力するだけです。単語がファイル名として存在するかどうかを確認するのはナンセンスです。

print "Enter a word to search for: "; 
chomp (my $word = <STDIN>); 

最後に、ファイルを読み取り、単語の頻度を検索します。あなたがそのために使用しているコードは、それはまた、ファイルが大きくなる場合には非効率的であるメモリにファイル全体をslurps ... ...理解することは非常に困難である

print "Frequency of word: " . grep $word eq $_, 
    split /\W+/i, do { local (@ARGV, $/)= $filename; <> }; 

代わりに、ファイルをwhileループで1行ずつ読み込みます。そして、行を単語に分割する代わりに、/\Q$word\E/gという行を検索してください。 /gは、最後にマッチした場所から検索を続行するように指示します。

my $frequency = 0; 
while(my $line = <$fh>) { 
    while($line =~ /\Q$word\E/g) { 
     $frequency++ 
    } 
} 

詳細はperlretutを参照してください。

+0

私は、第2のビットについてあなたが言ったこと以外はすべてが好きです。あなたは正しい、私はする必要はありませんが、私は学び、複雑になるためにしたいと思います。 (ちょうど冗談)しかし、あなたに私の「このような言葉は見つかりませんでした」という別の提案があった場合。声明をいただければ幸いです。 – distro

+1

@distro単語を検索した後*する必要があります。それから 'if($ frequency == 0){...} else {...}'。 – Schwern

関連する問題