2016-11-16 14 views
-1

我是相當新的編碼,我需要一個失敗聲明打印出來,就好像它是一個或死亡。作爲例子來我的代碼需要類似開放或死亡,除了與chomp

部分:

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>); 

我需要做的是爲這兩個打印/格格語句。無論如何只要加上這個?

整個程序:

#!/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; 
+2

開始你的計劃我有點在你的程序中的邏輯困惑,錯誤消息表明您正在做的事情有一個文件,但在這點它所做的就是從標準輸入讀取 – adrianp

+0

我可以發佈整個程序,但我不明白它會如何幫助,雖然考慮我的問題。 – distro

+0

哦,這個更新改變了一點,不是嗎。我的答案代表了從'<>'和'chomp'測試讀取的原始問題。我會更新到這個新內容。 – zdim

回答

2

你並不需要測試的文件句柄讀<>成功。見I/O Operators in perlop。當它沒有什麼可讀的時候,它會返回一個undef,這正是你想要的,所以你的代碼知道什麼時候停止閱讀。

至於刪除換行符,你想分開chomp。否則,一旦讀取確實返回undef,那麼您將在未定義的變量上觸發警告。

通常情況下,一個文件句柄$fh打開了一些資源,你會做

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

這可以STDIN爲好。如果它肯定是隻有一行

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

你並不需要測試chomp防止失效要麼。請注意,它返回已刪除的字符數,因此如果沒有$/(通常換行),則它合法返回0

要添加,這是一個非常好的做法,總是測試!作爲這種思維方式的一部分,請務必始終使用use warnings;,我也強烈建議使用use strict;進行編碼。


更新到顯著問題編輯

在第一while循環不存儲在任何地方的文件名。鑑於打印的問候,而不是該循環,你應該只讀取文件名。然後你閱讀這個詞來搜索。

# print greeting 

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

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

然而,然後我們得到了更大的問題:你需要open文件,也只有這樣,你可以通過它去一行一行地搜索單詞。這是你需要測試的地方。請參閱鏈接的文檔頁面和教程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是文件的測試之一,這一個檢查給定的文件是否存在。請參閱文檔頁面file-tests (-X)。在上面的代碼中,我們只是退出並顯示一條消息,但您可能想要在循環中打印提示用戶輸入其他名稱的消息。

我們在正則表達式中使用while/g修飾符來查找一行中單詞的所有出現。

我想也強烈建議總是與

​​
+0

但我想,我知道我不需要。 – distro

+0

@distro好的,原則上非常好 - 但是用'chomp'你不會想__。它返回一些刪除的字符,所以如果它沒有找到新行,它會返回一個零。因此,「正常」測試(使用'或')會導致錯誤的原因。如果你擔心一個內​​建函數調用只是_failing_,那麼你將不得不幾乎測試每一個語句! – zdim

+0

好的,我很欣賞這個建議。但是有沒有辦法做到這一點?如果用戶放入的文件不存在,我希望我的程序退出並顯示自己的消息。 – distro