use strict; use Data::Dumper; my $filename = 'test.txt'; # hier musst du angeben, wie deine Datei kodiert ist # unter Windows wahrscheinlich Windows-1252 statt utf-8 # die Angabe ist wichtig, damit Umlaute von der Regex # als Buchstaben erkannt werden. open my $inputFH, '<:encoding(utf8)', $filename or die $!; # hier gibst du an, in welcher Kodierung deine Ausgabe auf # die Konsole stattfinden soll. Achtung: dadurch werden Umlaute # von Data::Dumper trotzdem nicht angezeigt, wohl aber in # "printResult" unten. binmode STDOUT, ':utf8'; my @output; while (my $line = <$inputFH>) { my %wordCounter; for my $word (splitLineIntoWords($line)) { ++$wordCounter{$word}; } push @output, \%wordCounter; } printResult(\@output); # gibt auch Umlaute korrekt aus print Dumper \@output; sub splitLineIntoWords { my $line = shift; $line = lc($line); # Kleinbuchstaben - wäre zu debattieren, ob das im Sinne der Aufgabe ist $line =~ s/[^[:alpha:]]/ /g; # Alle Nicht-Buchstaben durch spaces ersetzen return split ' ', $line; # Spezialfall ' ': Whitespace-Split } sub printResult { my $outputLinesRef = shift; my $line = 1; for my $oline (@$outputLinesRef) { while (my ($k, $v) = each %$oline) { print "Zeile $line: Wort $k kommt ${v}x vor.\n"; } ++$line; } }