2

我正在编写一个 perl 脚本,其中 a 应该处理文本,然后为字典提供单词频率,然后对字典进行排序。该文本是 Edgar Poe 的“Golden Bug”的摘录,目的是计算所有单词的频率。但我做错了,因为我没有得到输出。我什么时候做错了?谢谢。

open(TEXT, "goldenbug.txt") or die("File not found");
while(<TEXT>)
{
chomp;
$_=lc;
s/--/ /g;
s/ +/ /g;
s/[.,:;?"()]//g;

@word=split(/ /);
foreach $word (@words)
    {
        if( /(\w+)'\W/ )
        {
            if($1 eq 'bug')
            {
                $word=~s/'//g;
            }
        }
        if( /\W'(\w+)/)
        {
            if(($1 ne 'change') and ($1 ne 'em') and ($1 ne 'prentices'))
            {
                $word=~s/'//g;
            }
        }

        $dictionary{$word}+=1;
    }
}

foreach $word(sort byDescendingValues keys %dictionary)
{
print "$word, $dictionary{$word}\n";
}

sub byDescendingValues
{
$value=$dictionaty{$b} <=> $dictionary{$a};
if ($value==0)
{
return $a cmp $b
}
else
{
    return $value;
}
}
4

2 回答 2

4

您的代码中有:

@word=split(/ /);
foreach $word (@words)
    {

您已将数组命名为@word拆分期间的名称,但您@words在 for 循环中使用了该数组。

@word=split(/ /);

应该

@words=split(/ /);

byDescendingValues例程中的另一个错字:

$value=$dictionaty{$b} <=> $dictionary{$a};
                ^^

正如其他答案中所建议的那样,您确实应该添加

use strict;
use warnings;

使用这些你可以很容易地发现这些错别字。没有它们,您将浪费大量时间。

于 2011-11-09T07:05:49.230 回答
2

除了混淆@word 和@words,您还使用了$dictionaty 而不是$dictionary。明智的做法是

use strict;
use warnings;

在程序开始时并使用 . 声明所有变量my。这样,Perl 本身就可以修复像这样的微不足道的错误。

于 2011-11-09T07:22:54.457 回答