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

Nicht lineare Ausführung von Code



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
luci
 2007-11-20 19:16
#102667 #102667
User since
2007-11-20
6 Artikel
BenutzerIn
[default_avatar]
Bei meinem linux apache server habe ich das Problem dass Speicher/Ladevorgänge in Dateien irgendwie nicht linear abzulaufen scheinen, er scheint im Programmcode unlogisch hin und her zu springen. Auf meinem samba Server und mit Perl Aufruf in der shell klappt alles wunderbar.

Hier der verkürze Code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$var1 = 1; # ist Abhängig von Dateinhalt der weiter oben eingelesen wurde
if ($var1 == 1) {
open (FILE, ">datei.txt");
print FILE "zeile";
close FILE;
print "AAA"; # oder $var2 = "AAA";
} else {
print "BBB"; # oder $var2 = "BBB";
}

# (Ausgabe: BBB)


Die Datei wird korrekt abgespeichert allerding erhalte ich dann als Ausgabe nicht "AAA" sondern "BBB". Das führt dann im Gesamtcode zu Überschneidungen, das Endergebnis ist nicht korrekt und gegen alle Programmierlogik.

Anscheinend hat es mit mod_perl zu tun. Ich will doch nur dass mein linearer Code auch Schritt für Schritt ausgeführt wird. Wie kann man das an/aus/wegschalten ... ich bin am verzewifeln.
Struppi
 2007-11-20 19:17
#102668 #102668
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
vermeide globale Variabeln.
pq
 2007-11-20 19:50
#102669 #102669
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also das codestück, dass du gepostet hast, wird entweder den if- oder den else-zweig
ausführen, daran kann auch mod_perl nichts ändern. höchstens bei aufeinanderfolgenden
requests und globalen variablen können die variablen evtl. werte haben, die man nicht
erwartet, aber dazu hast du zu wenig bzw. nicht den betroffenen teil des codes gepostet.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2007-11-20 23:46
#102691 #102691
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
luci+2007-11-20 18:16:29--
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$var1 = 1; # ist Abhängig von Dateinhalt der weiter oben eingelesen wurde
if ($var1 == 1) {
open (FILE, ">datei.txt");
print FILE "zeile";
close FILE;
print "AAA"; # oder $var2 = "AAA";
} else {
print "BBB"; # oder $var2 = "BBB";
}

# (Ausgabe: BBB)


Nein, dass kann nicht hinkommen. Wenn $var1 == 1 ist, dann wird auch der
if-Zweig ausgeführt und nicht der else! Du musst schon schauen warum $var1
nicht auf 1 gesetzt ist. Vielleicht steht auch was ganz anderes in $var1 und du
verwendest kein "use warnings;" - dann auch höchstwahrscheinlich kein "use strict;".

Warum verwendest du zudem kein die() nach dem open(). Wenn open() fehlschlägt,
bekommst du es nicht mit.

Wie tinita schon schrieb, ist das zu wenig Code um mehr sagen zu können.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
luci
 2007-11-21 12:23
#102697 #102697
User since
2007-11-20
6 Artikel
BenutzerIn
[default_avatar]
hallo nochmal,

hier ist der ganze code,

folgendes Script lasse ich auf meinem neuen Linux Apache Server laufen aber ich bekomme ein ganz anderes Resultat als wenn ich es in der shell mit perl aufrufe oder auf einem Samba-Server laufen lasse. Ich habe den Eindruck dass der Code nicht linear Stück für Stück abgearbeitet wird sondern Dateien früher gespeichert werden obwohl sie erst später im Code drankommen.

Lasse ich folgendes Script auf Apache laufen erhalte ich die falsche Ausgabe "1", über die perl shell oder Sambar erhalte ich die richtige Ausgabe -1. In beiden Fällen wird die Datei richtig beschrieben.

(die "log.txt" Datei ist beim ersten Aufruf leer)

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
#!/usr/bin/perl

print ("Content-type: text/html\n\n");

my $q = "hallo";
my $doubleVote = -1;

my $FILE;
open $FILE, "log.txt"; # Datei ist anfangs leer !
my @lines = <$FILE>;
close ($FILE);

foreach my $pair (@lines) {
if ($pair eq $q) {
$doubleVote = 1;
}
}

if ($doubleVote == -1) {
my $FILE;
open $FILE, ">> log.txt";
print $FILE $q;
close ($FILE);
}

print $doubleVote;

# Ausgabe auf Apache für $doubleVote: 1 (falsch)
# Ausgabe auf Perl/Samba für $doubleVote: -1 (richtig)
# In beiden Fällen wurde die Datei beschrieben, nur der Wert von
# $doubleVote ist unterschiedlich.
# (Anmerkung: wird das script ein zweites mal aufgerufen ändert sich unter
# Apache der Wert nicht, unter Perl/Sambar ändert er sich korrekt auf 1

Struppi
 2007-11-21 12:39
#102698 #102698
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Was hälst du von meinem Vorschlag?
luci
 2007-11-21 13:29
#102706 #102706
User since
2007-11-20
6 Artikel
BenutzerIn
[default_avatar]
die variable sind nicht global
renee
 2007-11-21 13:30
#102707 #102707
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was hältst Du von Fehlerabfragen??

z.B.:
Code (perl): (dl )
1
2
3
4
my $FILE;
open $FILE, "log.txt" or die $!; # Datei ist anfangs leer !
my @lines = <$FILE>;
close ($FILE);


oder noch besser:

Code (perl): (dl )
1
2
3
open my $FILE,'<', "log.txt"; # Datei ist anfangs leer !
my @lines = <$FILE>;
close ($FILE);


Genauso beim Schreiben der Datei!

Und Wiki:use strict solltest Du auch verwenden!

Lass Dir auch mal @lines ausgeben:

Code (perl): (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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper; # nur für die Testausgabe
use CGI::Carp qw(fatalsToBrowser); # damit Fehler im Browser angezeigt werden

print ("Content-type: text/html\n\n");

my $q = "hallo";
my $doubleVote = -1;

open my $FILE,'<', "log.txt" or die "Cannot open log.txt: $!"; # Datei ist anfangs leer !
my @lines = <$FILE>;
close ($FILE);

print '<pre>', Dumper(\@lines),'</pre>';

foreach my $pair (@lines) {
    if ($pair eq $q) {
        $doubleVote = 1;                               
    }
}

if ($doubleVote == -1) {
        open $FILE, ">>", "log.txt" or die "log.txt: " . $!;
        print $FILE $q;
        close ($FILE) or die "Can't close log.txt: $!";
}

print $doubleVote;
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/
luci
 2007-11-21 14:12
#102708 #102708
User since
2007-11-20
6 Artikel
BenutzerIn
[default_avatar]
Ich gebs auf, keine Fehlermeldungen, keine Warnungen ... der Dateinhalt der leeren
Datei ist bei Perl/Samba richtigerweise

$VAR1 = [];

bei Apache allerdings wurde der Wert in die Datei geschrieben NOCH BEVOR(!) der
Befehl dazu gegeben wurde.

$VAR1 = [ 'hallo'];

Danke für eure Mühe aber ich deistallier jetzt Apache und mach etwas besseres drauf.
renee
 2007-11-21 14:21
#102710 #102710
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das wird nicht am Apachen liegen. Wenn Du erst die Datei durch die Ausführung des Programms auf der Kommandozeile erzeugt hast, macht das Skript über den Apache genau das richtige...

Oder wird das Skript im Apache vielleicht zweimal aufgerufen (F5, Reload,anderer User,...)?
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/
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-11-20 19:16.