-1

私はコーディングにかなり慣れていないので、失敗したかのように出力するステートメントが必要です。

例の私のコードの一部:

    print "Please enter the name of the file to search:";
    chomp (my $filename=<STDIN>) or die "No such file exists. Exiting program. Please try again."\n;

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

これらの print/chomp ステートメントの両方でそれを行う必要があります。これに追加するだけの方法はありますか?

プログラム全体:

#!/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:";
while (<>){
        print;
}

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

my $filename = <STDIN>;

my$ctr=0;
foreach( $filename ) {
        if ( /\b$input\b/ ) {
                $ctr++;
        }
}
print "Freq: $ctr\n";

exit;
4

1 に答える 1

2

<>ファイルハンドルの読み取りが成功するかどうかをテストする必要はありません。perlop の I/O Operators を参照してください。読み取るものが何もない場合は、 が返されますundef。これは、コードがいつ読み取りを停止するかを知るために必要なものです。

改行の削除に関しては、とにかく個別にチョップしたいです。それ以外の場合、未定義の変数に対して 読み取りが返されると、警告がトリガーされundefます。chomp

通常、何らかのリソースでファイルハンドル$fhが開かれている場合は、次のようにします。

while (my $line = <$fh>) {
    chomp $line;
    # process/store input as it comes ...
}

これもありえますSTDIN。確かに1行なら

my $filename = <STDIN>;
chomp $filename;

chomp失敗に対してテストする必要もありません。削除した文字数を返すことに注意してください。したがって、$/(通常は改行) がない場合は、正当に を返します0

さらに、常にテストすることは非常に良い習慣です。その考え方の一部として、常に を確認してください。use warnings;また、 でコーディングすることを強くお勧めしuse strict;ます。


重要な質問の編集への更新

最初のwhileループでは、ファイル名をどこにも保存しません。印刷された挨拶を考えると、そのループの代わりにファイル名を読むだけです。次に、検索する単語を読み取ります。

# print greeting

my $filename = <STDIN>;
chomp $filename;

my $input = <STDIN>;
chomp $input;

しかし、さらに大きな問題が発生します。ファイルを開く必要があり、そのファイルを 1 行ずつ調べて単語を検索する必要があります。これは、テストが必要な場所です。リンクされたドキュメント ページとチュートリアルperlopentutを参照してください。まず、その名前のファイルが存在するかどうかを確認します。

if (not -e $filename) {
    print "No file $filename. Please try again.\n";
    exit;
}

open my $fh, '<', $filename  or die "Can't open $filename: $!";

my $word_count = 0;
while (my $line = <$fh>) 
{
    # Now search for the word on a line
    while ($line =~ /\b$input\b/g) {
        $word_count++;
    }
}
close $fh  or die "Can't close filehandle: $!";

上記-eはファイル テストの 1 つで、指定されたファイルが存在するかどうかを確認します。file-tests (-X)のドキュメントページを参照してください。上記のコードでは、メッセージを表示して終了するだけですが、ユーザーに別の名前を入力するよう促すメッセージをループで出力したい場合があります。

while正規表現で修飾子とを使用/gして、行内の単語のすべての出現箇所を見つけます。

また、常にプログラムを開始することを強くお勧めします

use warnings 'all';
use strict;
于 2016-11-16T23:39:56.270 に答える