#!/usr/bin/perl use strict; use warnings; # Solche Werte am Anfang des Scripts festlegen, damit man später # nicht lang im Script suchen muss, wenn sich etwas ändert. my ($vokabeln_file, $loesung_file, $nichtgekonnte_file) = ("Vokabeln.txt", "Loesung.txt", "nichtgekonnte.txt"); # Wie von Linuxer schon empfohlen: 3-Argument-Form des open() mit lexikalischem Filehandle open (my $vokabeln_FH, '<', $vokabeln_file) || die "Die Datei $vokabeln_file konnte nicht gefunden werden"; # So klappt das Einlesen mehrerer Zeilen in ein Array chomp(my @vokabeln_array = <$vokabeln_FH>); close ($vokabeln_FH); #my @vokabeln_array = split (/:+/, $vokabeln); open (my $loesung_FH, '<', $loesung_file) || die "Die Datei $loesung_file konnte nicht gefunden werden"; chomp(my @loesung_array = <$loesung_FH>); close ($loesung_FH); #my @loesung_array = split (/:+/, $loesung); #$#loesung_array; # Diese beiden Arrays sind verzichtbar, wenn die Datei nichtgekonnte.txt (wie schon von # Linuxer vorgeschlagen) mit '>>' for appending (also zum Anhängen) geöffnet wird. # Siehe perldoc -f open #my @alle_versuche; #my @alle_vokabeln; # Bei Deiner Methode wird nämlich jedes Mal, wenn der Benutzer nach einem # Fehler 1 wählt, die Datei nichtgekonnte.txt gelöscht und komplett # neu gefüllt. open(my $schreib_FH, ">>", $nichtgekonnte_file); #my $durchgaenge=0; # Statt ($durchgaenge<($#loesung_array+1)) würde ich schreiben # ($durchgaenge <= $#loesung_array) oder gleich for my $durchgaenge (0..$#loesung_array) { # In Schleifen sinnvoll einrücken # Warum 0+? Als Index werden ganze Zahlen verwendet, daher Umwandlung mit int() my $zahl=int(rand(3)); print "Translate the word $vokabeln_array[$zahl]\n"; # Wenn schon in einer Zeile, dann besser so: chomp(my $eingabe = ); #push @alle_versuche, $eingabe; #push @alle_vokabeln, $vokabeln_array[$zahl]; if ($eingabe eq $loesung_array[$zahl]) { print "The translation is correct!\n"; # Das Hochzählen übernimmt for #$durchgaenge++; } else { print "The translation is incorrect\n"; print "Do you want to save the incorrect word and answer?\n"; print "(1)Yes (2)No\n"; chomp(my $antwort=); # Der Vergleichsoperator für Zahlen ist '=='; für Strings eq, # - dann würde ich aber einen gequoteten String erwarten. # Perl drückt bei Deinem Konstrukt aber ein Auge zu. if ($antwort eq 1) { #open(my $schreib_FH, ">", $nichtgekonnte_file); #print $schreib_FH ">>Wrong:\n"; #print $schreib_FH join "\n", @alle_vokabeln; #print $schreib_FH "\n\n"; #print $schreib_FH ">>Answer:\n"; #print $schreib_FH join "\n", @alle_versuche; #close($schreib_FH); print $schreib_FH "Wrong: \"$eingabe\" for \"$vokabeln_array[$zahl]\" (correct is: \"$loesung_array[$zahl]\")\n"; #$durchgaenge++; } #else { #$durchgaenge++; #} } } close($schreib_FH);