Hallo alle!
Ich brauche eure Hilfe. Ich bin eine Anfängerin in Perl und soll ein Programm schreiben, das die Eingabe von zwei Wörtern fordert und dann sollen die Dateien von einem bestimmten Verzeichniss nach diesen Wörtern durchgeschaut werden. Dazu habe sollen die Hash-referenzen benutz werden. Ein Teil des Programms ist schon fertig, aber es funktioniert nur mit einem Wort, wenn ich nach zwei Wörtern suche, dann ist bei mir im Kopf alles durcheinander, ich verstehe einfach nicht wie ich die Eingabe in array speichern soll, dann sagen, such nach dem ersten Element von array in den Dateien aus dem Verzeichniss, dann nach dem Zweiten, und wenn die beiden Elemente in einer Datei auftauchen, dann soll ausgegeben werden Element 1 und Element2 sind in X enthalten. Könnte mir vielleicht hier jemand dabei helfen und das Programm verändern, so dass man nach zwei Wörtern suchen kann?
my %index;
my @array;
my @files = ;
foreach $file (@files)
{
open FILE_HANDLE, „$file“ or die „$!\n“;
foreach $line () {
$line =~ s/ü/ue/g;
$line =~ s/Ü/ue/g;
$line =~ s/ä/ae/g;
$line =~ s/Ä/ae/g;
$line =~ s/ö/oe/g;
$line =~ s/Ö/oe/g;
$line =~ s/ß/ss/g; @array = split(/\W/, $line);
foreach $wd (@array) {
if($wd =~ /[A-Za-z]/) {
$wd = lc($wd);
$index{$wd}->{$file}++;
}
}
}
close FILE_HANDLE;
}
So kann das auch nix werden, so würd ich auch nie wissen was ich tu.
Grundregel damit man seinem Gehirn hilft zu verstehen was noch nciht so ganz bekannt ist, ist die Dokumentation deines Codes.
Am anfang scheint es aufwenig, aber schon bei 2 bis 3 bildschirmseiten hilft es.
assoziatives array anlegen mit wort als index und wert $file incrementieren
$index{$wd}->{$file}++;
}
}
}
datei lesen beenden
close FILE_HANDLE;
}
Eingabe der Suche
Ausgabe der Frage
print „Nach welchem Wort soll gesucht werden?\n“;
Einlesen der Suche
my $input =;
leerzeichen entfernen
chomp $input;
ü in ue wandeln
$input =~ s/ü/ue/g;
Ü in ue wandeln
$input =~ s/Ü/ue/g;
ä in ue wandeln
$input =~ s/ä/ae/g;
Ä in ue wandeln
$input =~ s/Ä/ae/g;
ö in ue wandeln
$input =~ s/ö/oe/g;
Ö in ue wandeln
$input =~ s/Ö/oe/g;
ß in ue wandeln
$input =~ s/ß/ss/g;
eingabe wort in $wd in kleinbuchstaben
$wd = lc $input;
WENN suchwort als index in index
if (exists $index{$wd}) {
DANN ausgabe erfolg
print „Das Wort wurde gefunden!\n“;
gefundenen wert in $files speichern
$files = $index{$wd};
für jeden index key vom assoziativen $files
foreach $file(keys %$files)
{
Ausgabe anzahl und wo
print „Das Wort ‚$input‘ kommt in Datei ‚$file‘
$$files{$file} mal vor.\n“;
}
}
ANSONSTEN ausgabe kein erfolg
else {
print „Das Wort wurde nicht gefunden!\n“;
}
Ist dein Problem 2 suchwörter einzugeben ?
Ist dein Problem 2 mal die Eingabe für ein Suchwort hintereinander zu schreiben ?
Wie genau soll das aussehen . Deine Angaben lassen viel vermuten , aber es ist nicht die Aufgabe zu erfassen was du konkret willst. Damit mein ich genau was wo wie eingeben werden soll, und was wo wie rauskommen soll.
Übrigens kannst du auch die Eingabe genauso aufteilen wie es schon im Code gemacht wird für die eingelesene Zeile.
Und auch das durchlaufen des ergebnis hast du schon als foreach.
Der rest ist dann eigetnlich nur kopieren und anpassen.
vielen herzlichen Dank für deine Hilfe. Nur ich komme trotzdem nicht weiter. Ich glaube ich habe vorher das Problem nicht richtig beschrieben. Also wenn ich nach dem Wort Analyse suche mit diesem Teil des Programms:
$files = $index{$wd};
foreach $file(keys %$files)
{
print „Das Wort ‚$input‘ kommt in Datei ‚$file‘ $$files{$file} mal vor.\n“;
}
}
dann bekomme ich die Ausgabe Das Wort Analyse kommt in der Datei X 2 mal vor. Wenn ich aber nach syntaktische Analyse suche, dann kriege ich Problem, weil ich nicht verstehe, wie ich dieses Teil $files = $index{$wd};
foreach $file(keys %$files)
{
print „Das Wort ‚$input‘ kommt in Datei ‚$file‘ $$files{$file} mal vor.\n“;
}
}
verändern muss, damit es auch für zwei Wörter funktioniert. Ich habe probiert die Eingabe in einem array zu speichern und den dan an $wd übergeben, so dass lexikalische wäre dann $wd[0] und ‚Analyse‘ $wd[1] aber in diesen Zeilen oben weiß ich wirklich nicht weiter, ich habe dann versucht mit so etwas:
$files = $index{$wd[0]};
foreach $file(keys %$files)
{
print „Das Wort ‚$wd[0]‘ kommt in Datei ‚$file‘ $$files{$file} mal vor.\n“;
}
}
Das funktioniert nicht und irgendwie ganz intuitiv verstehe ich auch, dass es falsch ist, so was zu machen. Außerdem möchte ich als Ausgabe diese Möglichkeit haben:
{
print „Das Wörter ‚$input1‘ und ‚$input2‘ kommen in Datei ‚$file‘ vor. ‚$input1‘ kommt $$files{$file} mal vor und ‚$input2‘ kommt $$files{$file} mal vor\n“;
}
Ist es denn überhaupt möglich so etwas zu machen? Oder will ich da viel zu viel?
verboten ist es nicht, aber sehr schlechter Stil: Du fragst Freiwillige um Hilfe, ohne zu sagen, dass dir schon wo anders geholfen wird, und damit erzeugst du unnoetigen Mehraufwand - in einem Forum ist die Frage dann irgendwann beantwortet, im anderen macht sich jemand noch Aufwand, weil er nichts davon weiss.
Wenn du in mehreren Foren fragst, koenntest du wenigstens zu den anderen Diskussionen verlinken.