我正在编写一个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;
}
}
答案 0 :(得分:4)
您的代码中包含:
@word=split(/ /);
foreach $word (@words)
{
您在拆分期间已将数组命名为@word
,但您在for循环中使用数组@words
。
@word=split(/ /);
应该是
@words=split(/ /);
byDescendingValues
例程中的另一个错字:
$value=$dictionaty{$b} <=> $dictionary{$a};
^^
正如其他答案中所建议的,你真的应该添加
use strict;
use warnings;
使用这些可能很容易发现这些错别字。没有它们,你会浪费很多时间。
答案 1 :(得分:2)
除了混淆@word和@words之外,你还使用$ dictionaty而不是$ dictionary。
是明智的use strict;
use warnings;
在程序开始时使用my
声明所有变量。这样的琐碎错误就由Perl本身修复。