RegExp evl. falsch.

hehejo

hehejo

blöder Purist
Hallo, ich hab ein kleines Programm geschrieben, welches aus einer Datei alle Wörter rauszieht und mitzählt wie oft ein Wort vorkommt.
Dazu nehme ich mit RegExp die Satzzeichen weg usw..
Aber so ganz will es nicht klappen..
Einige Worte werden nicht aufgenommen, aber gezählt.
Das Programm und eine Testdatei hab ich angehängt. Hier findet er z.B. das Wort toll nicht, obwohl es mitgezählt wird.
Code:
Geben Sie eine Datei mit Text an: test.txt
Geben Sie eine Ausgabedatei an: out.txt
Bitte warten!
                ANALYSEERGEBNIS
Wort                    Anzahl          Prozent
-----------------------------------------------------------
gg                        1             16.66 %
hallo                     1             16.66 %
Insgesamt 6 Woerter[/quote]
Bestimmt ist es nur ein kleiner Fehler... *hoff*

Wie gehe ich vor:
Datei einlesen
Einzelne Zeilen mit RegExp bearbeiten
Zeile in Wörter aufsplitten
Ist Wort schon im Hash?
  ja: Dann Counter hochzählen
  nein: Einfügen und Counter auf 1 setzen
Ausgabe

Vll. kann mir ja jemand helfen.

//ADMIN EDIT
Sorry, war schneller mit dem löschen :)
 

Anhänge

  • analystpl.txt
    2,4 KB · Aufrufe: 10
  • test.txt
    36 Bytes · Aufrufe: 8
zuerst benutzt du mal

use warnings;
use strict;

und korrigierst dein script soweit, dass es damit laeuft.
Schon allein nur mit den Warnungen findet er einiges, was an deinem Skript nicht stimmt...
 
die runden und die eckigen Klammern müssen escaped werden. So wie auch noch einige andere Zeichen!

Code:
if(isWordinHash($word) == 1) {
                $count = $auflistung{$word};
                $count++;
                $auflistung{$word} = $count;
            }
            else {
                $auflistung{$word} = 1;
            }

Diesen ganzen Teil kann man auch als

Code:
  $auflistung{$word}++

schreiben! So kannste dir die extrafuntion etc. sparen.


steve
 
use strict und use warning

So, nun hab ich beides eingebaut und nach etwas Nachdenken und googlen mein Programm wieder zum Laufen gebracht.

Wenn ich aber ins Format TOP schreiben will, wirft er mir diese Warnungen:
Code:
Use of uninitialized value in open at E:\myPerl\Analyst\analyst.pl line 93.
write() on unopened filehandle TOP at E:\myPerl\Analyst\analyst.pl line 94.

Der Code dazu:
open TOP;
write TOP;

Dann bekomme ich aber immer noch nicht alle Wörter in mein Hash rein.
Ist das gleiche Problem wie vor dem Einsatz von "strict" und "warnings".
Steve schrieb:
die runden und die eckigen Klammern müssen escaped werden. So wie auch noch einige andere Zeichen!
Welche denn? Was bedeuten denn () und {} in RegExp?


"$auflistung{$word}++"ist einfach klasse.
Wie kann ich ein Hash auf NULL setzten, es leeren?
 

Anhänge

  • analystpl.txt
    2,3 KB · Aufrufe: 1
Wenn du ein Hash leeren möchtest gibt es mehrere Möglichkeiten, die die am deutlichste ist siehst du hier, man nutzt die keys-funktion und eine Schleife.
Code:
foreach $key (keys %HASH) {
    delete $HASH{$key};
}
Um es ganz einfach zu machen kannst du das Hash aber auch einfach neu definieren oder es "entdefinieren" :)
Code:
%HASH = ();
# oder ...
undef %HASH;

Ich kann dir http://www.perldoc.com nur wärmstens ans Herz legen, dort findest du gute man-pages im html format samt Suchfunktion.

ciao Exi
 
Danke.

"undef %HASH" sagt mir zu. Ist schnell getippt und ist IMHO auch selbsterklärend.

perdoc.com -> da schau ich hin!
 
Jo, undef ist auch schneller als die For-Schleife, aber ich finde es immer gut auch Beispiele zu geben die so eine Struktur der Handlung durchblicken lassen, die man dort gerade begeht.

Und Perldoc hat mich oft vor dem Selbstmord aufgrund eines Perlproblems gerettet in den letzten 3 Jahren. ;)

ciao Exi
 
Das hier verstehe ich nicht:
Code:
@buchstaben =split(/ */, 'hi there');[CODE]
Wie funktioniert "/ */"?
 
Kannst du mir bitte dennoch wegen dem geschlossenem Top helfen?
 
Ich kann erst heute gegen abend schaun, da ich noch auf der Arbeit bin.
 
Ich habe es mal entsprechend geaendert, damit es ohne Warnungen und scheinbar sogar richtig laeuft.
Angehaengt ist ein diff zum vorherigen Programm. Um zu verstehen was $~ macht solltest du die Dokumentation zu write lesen (perldoc perlfunc).
 

Anhänge

  • analystpldiff.txt
    868 Bytes · Aufrufe: 8

Ähnliche Themen

Klausurfragen

Zurück
Oben