подсчет букв для каждого слова в тексте с Perl - PullRequest
2 голосов
/ 31 мая 2011

Я пытаюсь написать программу с Perl, которая должна возвращать частоту всех слов в файле и длину каждого слова в файле (не сумму всех символов!), Чтобы получить кривую Zipf из испанского текста(не имеет большого значения, если вы не знаете, что такое кривая Зипфа).Теперь моя проблема: я могу сделать первую часть, и я получаю частоту всех слов, но я не знаю, как определить длину каждого слова!:( Я знаю командную строку $ word_length = length ($ words) , но после попытки изменить код я действительно не знаю, куда мне его включить и как посчитать длину для каждого слова.

Вот так выглядит мой код, пока не узнаешь:

#!/usr/bin/perl
use strict;
use warnings;

my %count_of;
while (my $line = <>) { #read from file or STDIN
  foreach my $word (split /\s+/gi, $line){
     $count_of{$word}++;
  }
}
print "All words and their counts: \n";
for my $word (sort keys %count_of) {
  print "$word: $count_of{$word}\n";
}
__END__

Надеюсь, у кого-нибудь есть предложения!

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Вы можете использовать хэш хэшей, если хотите сохранить длину слова.

while (my $line = <>) {
    foreach my $word (split /\s+/, $line) {
        $count_of{$word}{word_count}++;
        $count_of{$word}{word_length} = length($word);
    }
}

print "All words and their counts and length: \n";
for my $word (sort keys %count_of) {
    print "$word: $count_of{$word}{word_count} ";
    print "Length of the word:$count_of{$word}{word_length}\n";
}
1 голос
/ 31 мая 2011

Это напечатает длину прямо рядом с отсчетом:

  print "$word: $count_of{$word} ", length($word), "\n";
0 голосов
/ 31 мая 2011

Только для вашей информации - другая возможность для

length length($word)

может быть:

$word =~ s/(\w)/$1/g

Это не такое ясное решение, как toolic , но может дать вам другой взгляд на эту проблему ( TIMTOWTDI :))

Маленькое объяснение:

Модификатор

\ w и g соответствует каждой букве в вашем $ word

$ 1 предотвращает перезапись оригинала $ word на s ///

s /// возвращает количество букв (совпавших с \ w ) в $ word

...