3

我对 Perl 很陌生,我正在尝试编写一个词频计数器作为学习练习。

但是,在处理之后,我无法找出下面代码中的错误。这是我的代码:

$wa = "A word frequency counter."; 
@wordArray = split("",$wa);
$num = length($wa);
$word = "";
$flag = 1; # 0 if previous character was an alphabet and 1 if it was a blank.
%wordCount = ("null" => 0);
if ($num == -1) {
    print "There are no words.\n";
} else {
    print "$length";
    for $i (0 .. $num) {
        if(($wordArray[$i]!=' ') && ($flag==1)) { # start of a new word.
            print "here";
            $word = $wordArray[$i];
            $flag = 0;
        } elsif ($wordArray[$i]!=' ' && $flag==0) { # continuation of a word.
            $word = $word . $wordArray[$i];
        } elsif ($wordArray[$i]==' '&& $flag==0) { # end of a word.
            $word = $word . $wordArray[$i];
            $flag = 1;
            $wordCount{$word}++;
            print "\nword: $word";
        } elsif ($wordArray[$i]==" " && $flag==1) { # series of blanks.
            # do nothing.
        }
    }
    for $i (keys %wordCount) {
        print " \nword: $i - count: $wordCount{$i} ";
    }
}

它既不是打印“这里”,也不是单词。在这一点上,我并不担心优化,尽管在这个方向上的任何输入也将不胜感激。

4

3 回答 3

6

这是一个很好的例子,Perl 将帮助您找出问题所在,如果您只是寻求帮助。习惯于总是添加行:

use strict;
use warnings;

到您的 Perl 程序的顶部。

于 2012-04-08T07:28:12.157 回答
1

拳头,

$wordArray[$i]!=' '

应该

$wordArray[$i] ne ' '

根据用于比较字符串和字符的Perl 文档。基本上对数字使用数字运算符 ( ==, >=, ...),对文本使用字符串运算符 ( eq, ne, lt, ...)。

另外,你可以做

@wordArray = split(" ",$wa);

代替

@wordArray = split("",$wa);

然后@wordArray不需要进行不稳定的字符检查,你永远不会遇到问题。@wordArray将被拆分成单词,您只需要计算出现次数。

于 2012-04-08T05:13:51.993 回答
1

您似乎正在用 Perl 编写 C。不同之处不仅仅是一种风格。通过将字符串分解为单个字符的数组,您的脚本的内存占用也会爆炸。

此外,您需要考虑什么是单词。下面,我并不是说 any\w+是一个词,而是指出\S+和之间的区别\w+

#!/usr/bin/env perl

use strict; use warnings;
use YAML;

my $src = '$wa = "A word frequency counter.";';

print Dump count_words(\$src, 'w');
print Dump count_words(\$src, 'S');

sub count_words {
    my $src = shift;
    my $class = sprintf '\%s+', shift;
    my %counts;

    while ($$src =~ /(?<sequence> $class)/gx) {
        $counts{ $+{sequence} } += 1;
    }

    return \%counts;
}

输出:

---
答:1
计数器:1
频率:1
瓦:1
词:1
---
''A':1
$wa: 1
=: 1
计数器。”;:1
频率:1
词:1
于 2012-04-08T13:19:19.683 回答