2014-11-06 3 views
2

Я пытаюсь напечатать количество строк, количество слов, количество символов и распечатать слова в файле, а также количество раз, когда они происходят. Я получаю ошибки с последней частью (т. Е. Печатаю слова и их вхождения). Все остальное отлично работает.Печать частоты слов в текстовом файле Perl

Сообщения об ошибке я получаю:

Bareword found where operator expected at wc.pl line 34, near ""Number of lines: $lcnt\","Frequency" 
     (Missing operator before Frequency?) 
syntax error at wc.pl line 34, near ""Number of lines: $lcnt\","Frequency of " 
Can't find string terminator '"' anywhere before EOF at wc.pl line 34. 

Вот мой код:

#!/usr/bin/perl -w 

use warnings; 
use strict; 


my $lcnt = 0; 
my $wcnt = 0; 
my $ccnt = 0; 
my %count; 
my $word; 
my $count; 

open my $INFILE, '<', $ARGV[0] or die $!; 

while(my $line = <$INFILE>) { 

$lcnt++; 

$ccnt += length($line); 

my @words = split(/\s+/, $line); 

$wcnt += scalar(@words); 

     foreach $count(@words) { 
      $count{@words}++; 
     } 
} 

foreach $word (sort keys %count) { 


print "Number of characters: $ccnt\n","Number of words: $wcnt\n","Number of lines: $lcnt\","Frequency of words in the file: $word : $count{$word}"; 

} 

close $INFILE; 

Это то, что мне нужно это сделать: вход

Примера из текстового файла:

This is a test, another test 
#test# 234test test234 

Пример вывода:

Number of characters: 52 
Number of words: 9 
Number of lines: 2 
Frequency of words in the file: 
-------------------------------- 
#test#: 1 
234test: 1 
This: 1 
a: 1 
another: 1 
is: 1 
test: 1 
test,: 1 
test234: 1 

Любая помощь будет принята с благодарностью!

ответ

2

В коде есть некоторые логические ошибки и некоторые переменные злоупотребления. Для логических ошибок вам действительно нужно только один раз напечатать «Количество символов», но вы поставили его в цикле вместе с несколькими другими, которые должны быть напечатаны только один раз. Вытащите их из петли.

Далее вы не считали правильно; вы никогда не использовали слово в своей строке foreach $count (@words). Это то, что я назвал переменным злоупотреблением; «$count{@words}++» определенно не то, что вы хотели.

Была также одна опечатка, из-за чего Perl выдавал синтаксическую ошибку. Это был недостающий n от \n. Легкое исправление.

Наконец, мы постараемся сделать более эффективную работу по объявлению переменных в самом узком объеме. Вот как это может выглядеть:

my $lcnt = 0; 
my $wcnt = 0; 
my $ccnt = 0; 
my %count; 

while(my $line = <DATA>) { 

    $lcnt++; 
    $ccnt += length($line); 

    my @words = split(/\s+/, $line); 
    $wcnt += scalar(@words); 

    foreach my $word (@words) { 
     $count{$word}++; 
    } 
} 

print "Number of characters: $ccnt\n", 
     "Number of words: $wcnt\n", 
     "Number of lines: $lcnt\n", 
     "Frequency of words in the file:\n", 
     "-----------------------------------\n"; 

foreach my $word (sort keys %count) { 
    print "$word: $count{$word}\n"; 
} 

__DATA__ 
This is a test, another test 
#test# 234test test234 

я перешел к использованию __DATA__ дескриптора для теперь только для простоты. Вы можете легко вернуться к открытию входного файла.

+1

Я ценю помощь! @DavidO – chomp

1

Похоже, вы имели в виду, чтобы сделать \ п, но вместо этого сделал \», который ускользает конец строки цитаты

Изменение с;.

... "Number of lines: $lcnt\","Frequency of ... 

К;

... "Number of lines: $lcnt\n","Frequency of ... 
Смежные вопросы