Thread Array of Hashes aus Datei anlegen
(53 answers)
Opened by Flips87 at 2020-02-04 11:19
Hinweise mit XXX im Code:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 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 = <DATEI>; #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 (<DATEI>){ #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); Quote Wo ist denn dein Ausgabearray? Du hast @zeilen, was du für die Eingabe nimmst. Trenne das klar. Mach sowas wie Code (perl): (dl
)
1 2 3 4 5 6 7 8 my @output; while (my $line = <$inputFH>) { my %wordCounter; for my $word (splitLine($line)) { # splitLine muss du machen ++$wordCounter{$word}; } push @output, \%wordCounter; } Edit: Vielleicht hilft dir noch perlreftut. (und zum Kommentar zum open: perlopentut bzw. perlfunc open) Last edited: 2020-02-04 11:54:11 +0100 (CET) |