Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9978[/thread]

Seltsames Problem mit mod_perl und RegEx

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
windtaenze
 2007-08-06 19:39
#97662 #97662
User since
2007-08-06
11 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe hier ein Skript, dass ich gerade versuche auf mod_perl umzustellen. Das skript ist "use strict" ebenso alle von uns geschriebenen Module, die dort verwendet werden. Ich habe nun das seltsame Phänomen, dass es soweit normal funktioniert, aber wenn ich das Skript kurz hintereinander neulade, dieverse Regläre Ausdrücke nicht funktioniern.
Die Ausdrücke haben alle die Form:
Code (perl): (dl )
$OP =~ m/#![bezeichner]\(/

Hat einer eine Idee, woran das liegen könnte? Ich suche das Problem heute schon den ganzen Tag, kann es aber bisher noch nicht wirklich verstehen.

Es grüßt,

Tim aus Perl
MisterL
 2007-08-06 19:42
#97663 #97663
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Ein wenig mehr Cot(e) könnte nicht schaden ;)
Desweiteren: kann es sein, dass eine Datenquelle verändert wird oder ein Reaktionswert des Apache Servers zu hoch angesetzt wurde ?
“Perl is the only language that looks the same before and after RSA encryption.”
windtaenze
 2007-08-06 20:07
#97665 #97665
User since
2007-08-06
11 Artikel
BenutzerIn
[default_avatar]
Ich würde gerne etwas mehr Code posten, aber da der Code (noch) unter einer Closed Source Lizenz entwickelt wird, muss ich gucken, was ich posten kann. Abgesehen davon ist das Skript auch extrem lang. Ich werde schauen, dass ich da bis morgen ein wenig mehr Code rausziehe.
Aber was meinst du mit Reaktionswert des Apache? Ich bin, leider, nicht der Apache Guru.
Eine Datenquelle wird eigentlich nicht verändert, es werden nur ein paar Statistiken geschrieben, aber das sollte durchsein, da dass Skript nach dem ersten durchlauf komplett terminiert hat und die Seite komplett übertragen wurde.

Gruss, Tim
renee
 2007-08-06 20:23
#97666 #97666
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Sind da vielleicht globale Variablen im Spiel?? Die können einem bei mod_perl wohl die Laune verderben...
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/
windtaenze
 2007-08-07 11:31
#97689 #97689
User since
2007-08-06
11 Artikel
BenutzerIn
[default_avatar]
renee+2007-08-06 18:23:43--
Sind da vielleicht globale Variablen im Spiel?? Die können einem bei mod_perl wohl die Laune verderben...


Ja, das weiß ich, aber wie gesagt, alle unsere Skripte und Module benutzen "use strict;" und es gibt auch nur eine Variable die mit "our" deklariert ist, und die brauchen wir momentan auch, aber sie macht auch keine Probleme.
windtaenze
 2007-08-07 11:56
#97692 #97692
User since
2007-08-06
11 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

um vielleicht noch ein paar Anregungen zu bekommen, werde ich mal versuchen, das Skript um das es geht ein wenig zu beschreiben. Den Code posten kann ich leider nicht, da es sich, wie oben geschrieben um Closed Source handelt.
Das Skript ist das Hauptskript eines CMS, es ist sehr gewachsener Code, daher nicht immer besonders schön, benutzt aber inzwischen komplett "use strict;", so dass globale Variablen kein Problem sein sollten.
In dem Skript wird die Seite aus einer Template Datei und der eigentlichen Datei mit dem Content zusammengebaut. Sowohl in dem Template als auch im Content sind Anweisungen notiert, die alle die Form #!bezeichner: oder #!bezeichner(parameter): haben.
Ganz grob sieht das ganze ungefähr so aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
use strict;

# [...]

my $OP = gib_mir_den_seiten_code();

&contentparser;

# [...]

print $OP;

sub contentparser {
   if ($OP =~ m/#!bezeichner1\(/) { $OP = UnserModul->parse_bezeichner1($OP); }
   if ($OP =~ m/#!bezeichner2\(/) { $OP = UnserModul->parse_bezeichner2($OP); }
   # [...]
}


Ich weiß, dass das nicht gerade eleganter Code ist, das wird sich auch in nächster Zeit ändern, aber wir sind eine kleine Firma und der Code ist zum Teil recht alt.
Wenn ich das ganze als normales CGI Skript laufen lasse funktioniert es wunderbar, aber aus Performancegründen wollen wir das ganze unter mod_perl laufen lassen und da tritt jetzt das Phänomen auf, dass die if die Bezeichner nicht erkennen, wenn ich die Seite aufrufe und sobald sie fertig geladen ist nochmals neulade.

Hoffe mein Problem ist so etwas verständlicher.

Gruss,

Tim aus Perl
windtaenze
 2007-08-07 19:14
#97735 #97735
User since
2007-08-06
11 Artikel
BenutzerIn
[default_avatar]
Für die, die es interessiert, hier mal ein kurzes Statusupdate zu meinem mod_perl Problem:

Das Problem sind nicht die regulären Ausdrücke, sonder das hier Funktionen aufgerufen werden, die lustig Variablen ändern, die ihnen nicht übergeben wurden. Dadurch ist der Aufruf der Funktion immer gleich, was anscheinend dazu führt, dass die Funktion nur beim ersten mal ausgeführt wird. Bei allen weiteren Aufrufen wird nur noch der gespeicherte Rückgabewert zurückgegeben.
Ich meine von diesem Verhalten auch irgendwo gelesen zu haben, dachte aber, dass es standardmäßig nicht aktiv ist.
Hierraus folgt natürlich sofort die nächste Frage: Wie kann ich diese Verhalten abstellen?

Gruss,

Tim
ptk
 2007-08-07 22:58
#97742 #97742
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn du mod_perl per Apache::Registry verwendest, solltest du globale lexikalische Variablen vermeiden. Dann lieber our oder use vars verwenden.
windtaenze
 2007-08-08 00:12
#97744 #97744
User since
2007-08-06
11 Artikel
BenutzerIn
[default_avatar]
Hallo ptk,

wo ist denn das Problem bei lexikalischen Variablen im globalen Scope des Skriptes? Ich denke mit our deklarierte Variablen wären da problematischer, da diese ja sowohl im Skript als auch in den Modulen den selben Wert hätten.
Als Handler verwende ich übrigens nicht Apache::Registry, sondern ModPerl::Registry, wobei ich nicht weiß ob das einen Einfluß darauf hat, ModPerl::Registry ist doch die mod_perl 2.x Variante von Apache Registry, oder?

Gruss, Tim
sid burn
 2007-08-08 00:16
#97745 #97745
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
ptk+2007-08-07 20:58:39--
Wenn du mod_perl per Apache::Registry verwendest, solltest du globale lexikalische Variablen vermeiden. Dann lieber our oder use vars verwenden.

globale lexikalische Variablen? Was soll das den für ein neues Buzzword sein?

Es gibt globale oder lexikalische variablen.
- lexikalische Variablen sind die mit "my" deklariert.
- globale Variablen sind die mit "our" oder "use vars" deklarierten.

Ansonsten sollten man eher Globale Variablen vermeiden und nur lexikalische Variablen nehmen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-08-06 19:39.