Ich brauche Hilfe bei hash-referenzen

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;
}

print „Nach welchem Wort soll gesucht werden?\n“;
my $input =;
chomp $input;
$input =~ s/ü/ue/g;
$input =~ s/Ü/ue/g;
$input =~ s/ä/ae/g;
$input =~ s/Ä/ae/g;
$input =~ s/ö/oe/g;
$input =~ s/Ö/oe/g;
$input =~ s/ß/ss/g;
$wd = lc $input;
if (exists $index{$wd}) {
print „Das Wort wurde gefunden!\n“;

$files = $index{$wd};
foreach $file(keys %$files)
{
print „Das Wort ‚$input‘ kommt in Datei ‚$file‘ $$files{$file} mal vor.\n“;
}
}
else {
print „Das Wort wurde nicht gefunden!\n“;
}

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 für files

my %index;

array für die wörter einer zeile

my @array;

array files (virtueller datei inhalt)

my @files = ;

für jeden eintrag aus @files

foreach $file (@files)
{

öffne datei

open FILE_HANDLE, „$file“ or die „$!\n“;

für jede zeile von datei

foreach $line () {

ü in ue wandeln

$line =~ s/ü/ue/g;

Ü in ue wandeln

$line =~ s/Ü/ue/g;

ä in ue wandeln

$line =~ s/ä/ae/g;

Ä in ue wandeln

$line =~ s/Ä/ae/g;

ö in ue wandeln

$line =~ s/ö/oe/g;

Ö in ue wandeln

$line =~ s/Ö/oe/g;

ß in ue wandeln

$line =~ s/ß/ss/g;

zeile in wörter aufteilen und in @array packen

@array = split(/\W/, $line);

für jedes wort in @array

foreach $wd (@array) {

WENN das wort grossbuchstaben hat

if($wd =~ /[A-Za-z]/) {

DANN in kleine buchstaben wandeln

$wd = lc($wd);

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.

Hallo lacta alea est,

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?

Siehe auch
https://www.perl-community.de/bat/poard/thread/16458

Na so ein „Zufall“.

Gruesse,
Moritz

Ja ich habe das noch bei einem Forum gefragt, weil ich die Hilfe sehr brauche, ist es denn so schlimm oder verboten?

Hallo,

ist es denn so schlimm oder verboten?

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.

Gruesse,
Moritz

Hallo Moritz,

danke für deinen Hinweis, daran habe ich ja gar nicht gedacht. Ich werde bei dem anderen Forum mich bedanken und den Eintrag als gelöst zumachen.

LG
genja