use strict; use warnings; use Data::Dumper qw(Dumper); my ($datei, @zeilen, %hash); $datei = 'test.txt'; #XXX Deklariere&definiere die Variablen erst dann, wenn du sie brauchst. #XXX also my $datei = 'test.txt' #XXX Was ist das für ein Funktionsname? Was hat diese Funktion für Argumente? #XXX Hint: Argumente sind in @_ sub reg_exe { $_ = lc($_); $_ =~ s/\W+|\d|_/ /g; $_ =~ s/^\s+|\s+$//; } # Datei wird zeilenweise ausgelesen und in Array geschrieben # (pro Index eine Zeile) #XXX NEIN, du liest nicht zeilenweise, sondern alles auf einmal open(DATEI, "<$datei") || die "$datei kann nicht geoeffnet werden: $!"; #XXX Nutze bitte keine globalen Dateihandles! Und nimm die 3-argument-Form von open. #XXX Also: #XXX open my $inputFH, '<', $datei or die ... @zeilen = ; #XXX Das hier ist alles auf einmal, nicht zeilenweise foreach(@zeilen) { reg_exe(); } print Dumper \@zeilen; # Datei wird zeilenweise ausgelesen --> in Wörter gesplittet, # in Hash abgelegt und Anzahl der Häufigkeit ermittelt open(DATEI, "<$datei") || die; #XXX again, kein globales Dateihandle DATEI verwenden, sondern eine normale #XXX lokale Variable dafür nehmen! while (){ #XXX benennen schadet nicht. $_ ist toll für Einzeiler, aber nicht für Loops mit mehr als 1 Zeile! #XXX while (my $line = <$inputFH>) { foreach(split(/ /, $_)) { #XXX Auch hier benennen! #XXX for my $word (split(/ /, $line)) { #XXX mach was mit $word reg_exe(); $hash{$_}++; } } print Dumper \%hash; # Ausgabe AoH # ... close(DATEI);