我试图在文本文件中找到两个字符串,然后打印它们的频率。
#!/usr/bin/perl
#digram finder
use strict; use warnings;
#finds digrams in a file and prints them and their frequencies out
die "Must input file\n" if (@ARGV != 1);
my ($file) = @ARGV;
my %wordcount;
open (my $in, "<$file") or die "Can't open $file\n";
while (my $words = <$in>){
chomp $words;
my $length = length($words);
for (my $i = 0; $i<$length; $i++){
my $duo = substr($words, $i; 2);
if (not exists $wordcount{$duo}){
$wordcount{$duo} = 1;
}
else {
$wordcount{$duo}++;
}
}
}
foreach my $word (sort {$wordcount{$b} cmp $wordcount{$a}} keys %wordcount){
print "$word\t$wordcount{$duo}\n";
}
close($in);
当我尝试运行代码时,我收到错误消息,我忘记在第17行声明$ word但我甚至没有字符串$ word。我不确定此错误消息来自何处。有人可以帮我找出错误的来源吗?
谢谢
答案 0 :(得分:1)
我最好的猜测是你实际上有$word
而不是$words
;一个错字。如果编译在文本中找到了符号$word
,那么它可能就在那里。
但是,我也想对代码发表评论。清理版
while (my $words = <$in>) {
chomp $words;
my $last_duo_idx = length($words) - 2;
for my $i (0 .. $last_duo_idx) {
my $duo = substr($words, $i, 2);
++$wordcount{$duo};
}
}
my @skeys = sort { $wordcount{$b} <=> $wordcount{$a} } keys %wordcount;
foreach my $word (@skeys) {
print "$word\t$wordcount{$word}\n";
}
这在一个虚构的文件上正确运行。 (我只是单独排序,以免跑掉页面。)
评论
需要在该行中最后一个停止,substr
从0
开始;因此-2
几乎不需要C风格的循环
此处无需测试是否存在密钥。如果它不存在则 autovivified (已创建),然后使用1
递增到++
;否则计数会增加。
使用<=>
进行数字排序,而不是cmp
错别字:
substr($words, $i; 2)
需要,
而不是;
,所以substr($words, $i, 2)
$wordcount{$duo}
应为$wordcount{$word}
。我不确定是否命名:为什么一行文字称为$words
?