2016-11-17 3 views
1

Ich brauche Hilfe bei der Anpassung dieser Block meines Codes. Alles funktionierte, aber dann hörte es auf zu arbeiten und versagte jedes Mal (Drucke). Was mache ich falsch?Brauchen Sie einen Vorschlag mit 'if' Anweisung

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

Ganzes Programm.

#!/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

Was erwarten Sie von dieser Linie? Weil es prüft, ob eine Datei nicht existiert, was im Kontext nicht sinnvoll ist. Und diese "Trennung" ist eine wirklich seltsame Art, Wörter aus einer Datei zu lesen ... wenn es überhaupt funktioniert. – Schwern

+1

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

Antwort

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

So, das nach, wird dieses Programm ...

  1. Bitten Sie den Benutzer eine Datei für die Suche.
  2. Fragen Sie den Benutzer nach einem Wort, nach dem gesucht werden soll.
  3. Überprüfen Sie, wie oft das Wort in dieser Datei ist.

Sie haben den ersten Teil unten.

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

Obwohl kann es ein bisschen kurz und bündig die unter Verwendung erfolgen statt print + exit. Und im Allgemeinen sollten Sie versuchen, eine Datei zu öffnen, anstatt zu prüfen, ob eine Datei existiert. Eine Datei ist möglicherweise vorhanden, aber nicht lesbar. Oder es existiert möglicherweise , wenn Sie überprüft und dann gelöscht werden, wenn Sie später versuchen, es zu öffnen.

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 $!"; 

Dann für das zweite Bit müssen Sie nur nach dem Wort fragen. Überprüfen, ob das Wort als Dateiname existiert, ist Unsinn.

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

Und schließlich, die Datei lesen und das Wort Frequenz finden. Der Code, den Sie dafür verwenden ist sehr schwer zu verstehen ...

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

... es schlürft auch die gesamte Datei in den Speicher, die ineffizient ist, wenn die Datei groß wird.

Lesen Sie stattdessen Dateien zeilenweise mit einer while-Schleife. Und statt die Zeile in Wörter aufzuteilen, durchsuchen Sie die Zeile mit /\Q$word\E/g. /g sagt, um die Suche vom letzten übereinstimmenden Ort fortzusetzen.

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

Weitere Informationen finden Sie unter perlretut.

+0

Ich mag alles außer was Sie über das zweite Bit gesagt haben. Du hast recht, ich brauche es nicht, aber ich möchte es lernen und kompliziert werden. (Nur ein Scherz) Aber wenn Sie einen anderen Vorschlag hatten, der mein "Kein solches Wort gefunden" beinhaltet. Aussage, die geschätzt würde. – distro

+1

@distro Das musst du tun * nachdem * du nach dem Wort gesucht hast. Dann 'if ($ frequency == 0) {...} else {...}'. – Schwern

Verwandte Themen