Thread Array of Hashes aus Datei anlegen (53 answers)
Opened by Flips87 at 2020-02-04 11:19

Raubtier
 2020-02-04 11:46
#191261 #191261
User since
2012-05-04
1075 articles
BenutzerIn
[default_avatar]
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
Durch Data::Dumper weiß ich, dass in meinem erzeugten Array tatsächlich pro Index eine Zeile der Textdatei enthalten ist und dass mein Hash in der Lage ist, Wörter und Häufigkeit aufzuschlüsseln. Leider ist es mir nicht gelungen, beides zu kombinieren. Bisherige Recherchen haben mich auch nicht weitergebracht. Ich hoffe, ihr könnt mir helfen, da ich ein blutiger Anfänger bin.


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 Perldoc:perlreftut.
(und zum Kommentar zum open: Perldoc:perlopentut bzw. Perldoc:perlfunc open)
Last edited: 2020-02-04 11:54:11 +0100 (CET)

View full thread Array of Hashes aus Datei anlegen