2012-04-08 6 views
3

Ich bin Perl sehr neu, und ich versuche, ein Wort Frequenzzähler als Lernübung zu schreiben.Warum wird mein Beispiel für das Wort Frequenzzähler in Perl geschrieben, das keine brauchbare Ausgabe liefert?

Ich bin jedoch nicht in der Lage, den Fehler in meinem Code unten herauszufinden, nachdem ich daran gearbeitet habe. Das ist mein Code:

$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} "; 
    } 
} 

Es ist weder Drucken "hier", noch die Worte. Ich mache mir zu diesem Zeitpunkt keine Gedanken über die Optimierung, obwohl jede Eingabe in diese Richtung ebenfalls sehr geschätzt würde.

Antwort

1

Faust aus,

$wordArray[$i]!=' ' 

$wordArray[$i] ne ' ' 

nach dem Perl documentation zum Vergleichen Strings und Zeichen sein sollte. Verwenden Sie im Grunde numerische Operatoren (==, >=, & hellip;) für Zahlen und Stringoperatoren für Text (eq, ne, lt, & hellip;).

Auch könnten Sie

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

statt

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

tun und dann würde @wordArray nicht tun müssen, die wackelig Charakter prüft und Sie würden nie das Problem gehabt haben. @wordArray wird bereits in die Wörter aufgeteilt und Sie müssen nur die Vorkommnisse zählen.

+0

Vielen Dank für die beiden Vorschläge. Sie arbeiteten. – Brahadeesh

6

Dies ist ein gutes Beispiel für ein Problem, bei dem Perl Ihnen hilft, herauszufinden, was falsch ist, wenn Sie es nur um Hilfe bitten. Lassen Sie sich bei immer das Hinzufügen der Linien verwendet:

use strict; 
use warnings; 

an der Spitze Ihrer Perl-Programme.

1

Sie scheinen C in Perl zu schreiben. Der Unterschied ist nicht nur der Stil. Wenn Sie einen String in ein Array einzelner Zeichen auflösen, explodieren Sie ebenfalls.

Auch müssen Sie darüber nachdenken, was ein Wort ausmacht. Im Folgenden schlage ich nicht vor, dass irgendein \w+ ein Wort ist, eher den Unterschied zwischen \S+ und \w+ hervorhebend.

#!/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; 
} 

Ausgang:

--- 
A: 1 
counter: 1 
frequency: 1 
wa: 1 
word: 1 
--- 
'"A': 1 
$wa: 1 
=: 1 
counter.";: 1 
frequency: 1 
word: 1