2016-11-17 3 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

Что вы ожидаете от этой линии? Потому что он проверяет, нет ли файла, который не имеет смысла в контексте. И этот 'split' - это действительно странный способ чтения слов из файла ... если он вообще работает. – 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 $!"; 

Затем для второго бита вам нужно всего лишь запросить слово. Проверка того, существует ли слово в качестве имени файла, является бессмысленной.

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

И, наконец, чтение файла и поиск частоты слова. Вы используете для этого код очень трудно понять ...

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

... это также хлебает весь файл в память, которая является неэффективным, если файл становится большим.

Вместо этого прочитайте файлы по строкам с помощью цикла while. И вместо того, чтобы разбивать строку на слова, выполните поиск по строке с помощью /\Q$word\E/g. /g говорит, чтобы продолжить поиск с последнего места, которое вы соответствовали.

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

См. perlretut для получения дополнительной информации.

+0

Мне нравится все, кроме того, что вы сказали о втором бите. Вы правы, мне это не нужно, но я хотел бы ради обучения и усложнения. (просто шучу) Но если бы у вас было еще одно предложение, связанное с моим «Нет такого слова найдено». заявление, которое будет оценено по достоинству. – distro

+1

@distro Вы должны сделать это * после *, вы ищете слово. Затем 'if ($ frequency == 0) {...} else {...}'. – Schwern

Смежные вопросы