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のドキュメントによると。基本的に、数値には数値演算子(、、==… )を使用し、テキスト( 、、、、>=…)には文字列演算子を使用します。eqnelt

また、あなたはすることができます

@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;
}

出力:

---
A:1
カウンター:1
頻度:1
wa:1
ワード:1
---
'"A':1
$ wa:1
=:1
カウンター。";:1
頻度:1
ワード:1
于 2012-04-08T13:19:19.683 に答える