2

我正在尝试使用 Perl 编写一个程序,它应该返回文件中所有单词的频率和文件中每个单词的长度(不是所有字符的总和!)以从西班牙语文本中生成 Zipf 曲线(不是如果您不知道 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__

我希望有人有任何建议!

4

3 回答 3

2

如果要存储单词的长度,可以使用 hash of hashes。

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";
}
于 2011-05-31T17:34:08.770 回答
1

这将在计数旁边打印长度:

  print "$word: $count_of{$word} ", length($word), "\n";
于 2011-05-31T14:37:44.367 回答
0

仅供参考 - 另一种可能性

length length($word)

可能:

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

它不像工具那样明确的解决方案,但可以为您提供有关此问题的其他观点(TIMTOWTDI :)

小解释:

\wg修饰符匹配$word中的每个字母

$1防止s///覆盖原始$word

s///返回$word中的字母数(与\w匹配)

于 2011-05-31T16:30:04.043 回答