Perl Frequency sorting и другие вещи - PullRequest
2 голосов
/ 18 октября 2011

Редактировать:

Итак, я отлично справился со сценарием со всей вашей помощью, поэтому большое спасибо.

Я также пытаюсь выяснить, как сохранить стандартный выбор вводано все равно можно использовать командную строку "start", а также,

Я хочу, чтобы оба могли запускать ее, например, ex."perl wfreq.pl", и затем он спрашивает пользователя, какой файл, но я также хочу иметь возможность запустить его, сказав "perl wfreq.pl example.txt", и тогда он не должен запрашивать ввод пользователя.

Возможно ли это?

#! /usr/bin/perl

use utf8;
use warnings;

print "Please enter the name of the file: \n" ;
$file = <STDIN>;
chop $file;


open(my $DATA, "<:utf8", $file) or die "Oops!!: $!";
binmode STDOUT, ":utf8";

while(<$DATA>) {                          
    tr/A-Za-z//cs;
    s/[;:()".,!?]/ /gio;                   
    foreach $word (split(' ', lc $_)) {  
    $freq{$word}++;                  
     }
}
foreach $word (sort { $freq{$b} <=> $freq{$a} } keys %freq) {           
   @fr = (@fr, $freq{$word});
   @ord = (@ord, $word);        
}
for ($v =0; $v < 10; $v++){
print " $fr[$v] | $ord[$v]\n";
}

Ответы [ 3 ]

4 голосов
/ 18 октября 2011

Как писал MVS , вам нужно использовать оператор <=> "космического корабля" и сортировать не ключи, а значения. Вот пример, который должен работать:

Изменить

foreach $word (sort keys %freq) {        
    print "$word $freq{$word}\n";        
}

К

foreach $word (sort { $freq{$a} <=> $freq{$b} } keys %freq) {        
    print "$word $freq{$word}\n";
}

perldoc -f sort содержит точно такой же пример в строках 23-27 фрагмента кода.

Говоря о кодировке: документация по utf8 прагме говорит, что использовать ее для

включить / отключить UTF-8 (или UTF-EBCDIC) в исходном коде

Чтобы включить UTF-8 при вводе файла, вам нужно открыть файл в определенном режиме (используя определенный слой) и применить слой 'utf8' к STDOUT:

open(my $DATA, "<:utf8", $file) or die "Oops!!: $!";
binmode STDOUT, ":utf8";

Для получения дополнительной информации о :utf8 и других слоях ввода-вывода, вы можете прочитать

  1. : описание слоя utf8
  2. perldoc -f open
  3. perldoc -f binmode
1 голос
/ 18 октября 2011

sort keys отсортирует по ключам хеша, которые являются самими словами. Вместо этого вы захотите отсортировать по значениям. Посмотрите на документацию , чтобы помочь вам (в частности, части о "операторе космического корабля" <=>).

Чтобы поставить цифры перед словами, просто переключите $word и $freq{$word} в операторе print.

Что касается возврата только первых 10 результатов, попробуйте счетчик внутри цикла foreach (и оператор break).

Для символов UTF-8 ваш use utf8 должен быть достаточно хорош, чтобы включить их, но если у вас возникли проблемы, это может помочь.

0 голосов
/ 18 октября 2011

Вы можете использовать кучу интересных вещей в Perl:

perl -CS -F\\PL+ -alne'$f{lc$_}++for@F}{print"$f{$_} $_"for sort{$f{$b}<=>$f{$a}}keys%f'

Подробнее см. perlrun(1).

...