Schrift
[thread]8786[/thread]

Problem: Endlosschleife?



<< >> 4 Einträge, 1 Seite
Pida
 2007-02-23 14:50
#74543 #74543
User since
2006-06-09
52 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich stehe grade vor einem Problem, das ich auch in 8 Stunden nicht lösen konnte... dabei geht es nur um gute 15 Zeilen Code:

Ich habe die hashes %referentenliste und %anaphernliste. Für beide gilt: Die Keys sind Integer, die Werte Arrays aus Strings. Beide Hashes bestehen aus der gleichen Anzahl von Schlüssel-/ Wertepaaren. Ich möchte nun die Keys (Sätze) von 1-n durchgehen und dabei Key für Key (satzweise) die einzelnen Anaphern (Elemente aus @{$anaphernliste{$index}}) abarbeiten.
Jede Anapher wird dazu auf einen bestimmten Teil reduziert und $muster zugewiesen.
Dann schaue ich für den aktuellen Satz und alle vorangegangenen Sätze, ob in den $kandidat aus @{$referentenliste{$i}} das gleiche Muster enthalten ist. Ist das der Fall, soll $kandidat auf @kandidatenliste gepusht werden.

Leider klappt das nicht. Anscheinend komme ich in eine Endlosschleife, die ich mit STRG + C beenden muss.

Was läuft falsch? Im Anhang findet ihr den Code; leider nicht schön formatiert. Die Zeilen sind wohl zu lang; zudem wurden immer wieder &nbsp; ausgegeben.

Vielen Dank, Pida

Code: (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
my $index = 1;
my $satzzahl = @sort_keys_satzliste;
while ($index <= $satzzahl) {

# solange der satzindex die zahl der sätze nicht übersteigt
while (@{$anaphernliste{$index}}) {

# solange noch anaphern auf der liste des aktuellem satzes stehen
my $aktuelles_pronomen = shift (@{$anaphernliste{$index}}); # shifte eine anapher
my $muster = $aktuelles_pronomen;

# weise $muster die aktuelle anapher zu
$muster =~ s/\(.*(\d[sp]).*\)/$1/;

# reduziere $muster auf 3s, 2p o.ä.
print $muster;
for (my $i = $index; $i > 0; $i--) {
# für diesen satz und alle davor tue
my @kandidatenliste;

foreach my $kandidat (@{$referentenliste{$i}}) { # für jeden referenten des aktuellen satzes

if ($kandidat =~ /$muster/) {
# wenn $muster teil des aktuellen referenten ist

push (@kandidatenliste, $kandidat); # pushe den aktuellen referenten auf @kandidatenliste
}
}
print @kandidatenliste;
# gib die liste aus
}
$index++; # zum nächsten satz

}
}
\n\n

<!--EDIT|renee|1172236917-->
renee
 2007-02-23 15:23
#74544 #74544
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest von while- auf for-Schleifen umsteigen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GoodFella
 2007-02-23 16:43
#74545 #74545
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Schau dir mal genau an, was hier passiert:

Code (perl): (dl )
1
2
3
4
5
6
7
8
...
  while (@{$anaphernliste{$index}}) 
   {
    my $aktuelles_pronomen = shift (@{$anaphernliste{$index}});  
...
     }
    $index++;
...


wenn @{$anaphernliste{$index}} nicht existiert ... erstellt perl dies dann nicht in diesem Fall? (ungetestet und nur eine Vermutung) ..Dann währe der Ausdruck nach while immer wahr.

..Und @{$anaphernliste{$index}} wird niemals leer, da du ja nur ein Element raus-shiftest und dann zur nächsten Liste wechselst (es sei denn sie enthält nur einen Eintrag). Ich glaube das wolltest du so nicht ..\n\n

<!--EDIT|GoodFella|1172241909-->
Pida
 2007-02-23 17:50
#74546 #74546
User since
2006-06-09
52 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für eure Ratschläge.

Ich habe den Tip bezüglich der For-Schleifen so weit umgesetzt, wie mir das möglich war und bin weiter gekommen. Jetzt hänge ich nur noch an einer einzigen For-Schleife:

Die Schleife ist Teil einer anderen und wird im Programmablauf mehrmals aufgerufen. Wie ich anhand der ersten print-Anweisung feststellen kann, funktioniert das auch soweit. Ausgegeben wird 3 bzw. 2 bzw. 1. Entsprechend wird $r_i initialisiert. Für die letzten 2 Fälle gilt dabei, dass das Array aus Zeile 2 nicht leer ist. Es müsste also die while-Schleife durchlaufen werden. Offensichtlich geschieht dies aber nie, denn die zweite Printanweisung wird nie ausgeführt.

Woran hakt es jetzt noch?

Gruß, Pida

Code: (dl )
1
2
3
4
5
6
7
8
9
print "$s_i";  
for (my $r_i = $s_i; $r_i > 0; $r_i--) { # für diesen satz und alle davor tue while (@{$referentenliste{$r_i}}) { # solange es referenten im aktuellen satz gibt
my $kandidat = shift (@{$referentenliste{$r_i}}); # shifte einen referenten
print "kandidat: $kandidat";
if ($kandidat =~ /$muster/) { # wenn $muster teil des aktuellen referenten ist
push (@kandidatenliste, $kandidat); # pushe den aktuellen referenten auf's Array
}
}
}
<< >> 4 Einträge, 1 Seite



View all threads created 2007-02-23 14:50.