Schrift
[thread]11574[/thread]

Rekursion einer anderen Funktion feststellen?



<< >> 3 Einträge, 1 Seite
johann_p
 2008-04-03 22:44
#107834 #107834
User since
2008-04-03
3 Artikel
BenutzerIn
[default_avatar]
Ich habe folgendes Problem: ich habe eine Closure geschrieben, die von einem bestehenden perl Programm verwendet wird, um auf eine Datenbank zuzugreifen und bestimmte Daten zu retournieren.
Diese Closure wird im Programm viele Male aufgerufen. Es kann auch passieren, dass diese Closure im Rahmen einer Rekursion aufgerufen wird:
Funtion A ruft Closure auf bekommt Daten und ruft aufgrund der Daten potentiell wieder Funktion A auf die wiederum die Closure aufruft.

Bei einer bestimmten Datenkonstellation kann es nun vorkommen, dass die Rekursion endlos wird: die Closure retourniert daten, die dazu führen dass Funktion A sich immer wieder rekursiv aufruft.

Mein Problem: ich kann weder die Daten, noch die Funktion A ändern, sondern muss versuchen, die Rekursion in meiner Closure zu erkennen und dann statt der Daten undef zu retournieren.

Ich sehe keinen anderen Weg als dass meine Closure den Calling Stack Frame irgendwie analysiert und so die Rekursion erkennt -- aber wie?

Wie kann diese Problem gelöst werden? Wie kann man den Aufrufstack analysieren um zu erkennen dass eine Funktion zb schon 50 mal rekursiv aufgerufen wurde?
pktm
 2008-04-03 22:49
#107836 #107836
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Wir haben hier etwas dazu:
http://wiki.perl-community.de/bin/view/Wissensbasi...

Und caller() (siehe perldoc perlfunc) kann einiges.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
johann_p
 2008-04-03 23:24
#107839 #107839
User since
2008-04-03
3 Artikel
BenutzerIn
[default_avatar]
Danke, der Trick ist offenbar caller($i) der Reihe nach mit $i=1..N aufzurufen und zu sehen, wie oft da die Funktion A aufscheint -- auf diese Weise kann ich feststellen ob der rekursive Aufruf zu oft erfolgt ist.

Danke!
<< >> 3 Einträge, 1 Seite



View all threads created 2008-04-03 22:44.