Schrift
[thread]253[/thread]

Warum hängt sich Perl auf?



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
bony
 2004-05-09 17:58
#2363 #2363
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

welche Gründe außer einer Endlosschleife bringen Perl (perl.exe) eigentlich dazu, sich aufzuhängen? Momentan habe ich das Problem mit folgendem Code-Snipped und ich komme einfach nicht auf den Fehler darin. Vielleicht kann mir ja jemand vom Schlauch runter helfen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Falls Versand gewählt wurde, müssen die Versandkosten berechnet werden
my $shippingCosts = undef;
my $shippingCostsCD = undef;
my $total = $subtotal;

if ( $orderDigital eq "cdromPost" ) {
   $shippingCostsCD = $shipKompakt;
}
if ( ( $orderShipping eq "post" ) || ( $orderDigShipping eq "digPost" ) ) {
   $shippingCosts = calculateShipping( $picOptions );
}

# Die höheren Versandkosten sind ausschlaggebend
if ( $shippingCostsCD > $shippingCosts ) {
   $total = $total + $shippingCostsCD;
}
else {
   $total = $total + $shippingCosts;
}

Nehme ich hier die Zeilen ab Zeile 8 raus, läuft das Skript ohne Probleme. Am Aufruf der Sub calculateShipping kann es nicht liegen. Der Fehler tritt auch auf, wenn ich hier versuchsweise einen festen Wert definiere.
Perl bleibt einfach ohne Fehlermeldung hängen.
betterworld
 2004-05-09 18:33
#2364 #2364
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Bist Du sicher, dass Perl waehrend dieses Codeblocks haengen bleibt? Die Tatsache, dass das Programm ohne diese Zeilen laeuft, kann auch den Grund haben, dass die Werte, die hier initialisiert werden, spaeter den Ablauf beeinflussen.
Schreib mal am Anfang davor
Code: (dl )
print "rein\n";

und am Ende dahinter
Code: (dl )
print "raus\n";
\n\n

<!--EDIT|betterworld|1084113236-->
[E|B]
 2004-05-09 19:06
#2365 #2365
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Was macht calculateShipping?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
lichtkind
 2004-05-09 22:06
#2366 #2366
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
nimm doch OpenPerlIDE oder so geh mal schritt fúr schritt durch mit variablen úberwachung
so gehts meist am schnellsten rauszufinden was da wirklich passiert
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
bony
 2004-05-09 22:39
#2367 #2367
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

danke soweit für die Tips.

OpenPerlIde kannte ich bisher nicht. Werde ich mir mal anschauen (bisher verwende ich ganz einfach Proton als Editor).

An calculateShipping kann es nicht liegen, weil, wie erwähnt, der Fehler auch auftritt, wenn ich die Sub nicht aufrufe und dort einen festen Wert definiere (die Funktion liefert eine Zahl zwischen 0.55 und 3.68).

Ich schätze aber, ich habe den Fehler gefunden:
Die Berechnungen sind Teil einer Unterfunktion, die Änderungen an einer Bilderbestellung in die Datenbank einträgt. Danach wird die Unterfunktion aufgerufen, die die Bestellung anzeigt. Dort wird fast die gleiche Berechnung nochmals durchgeführt, weil diese Unterfunktion zur Ausgabe der Bestelldaten natürlich auch aufgerufen wird, wenn keine Änderung durchgeführt wurde. Liegt das Aussteigen von Perl dann daran, dass die Variablen also nochmals mit "my" initialisiert werden?
jan
 2004-05-09 22:58
#2368 #2368
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein. damit werden sie nur erneut lokal erzeugt, d.h. du kannst sie in dem unteren block benutzen, ohne den oberen damit zu tangieren.
bony
 2004-05-09 23:37
#2369 #2369
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Sorry @ [E|B]. Das Problem scheint doch was mit der Funktion calculateShipping() zu tun zu haben. Wenn ich die Funktion in beiden Fällen umgehe, läuft das Skript. Die Funktion sieht folgendermaßen aus:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
sub calculateShipping {
   my ( $picOptions ) = @_;

   my $shippingCosts = undef;

   if ( $picOptions->[ 9 ] || $picOptions->[ 8 ] || $picOptions->[ 7 ] || $picOptions->[ 6 ] ) {
       $shippingCosts = $shipRolle;
   }

   elsif ( $picOptions->[ 5 ] ) {
       if ( $picOptions->[ 5 ] > 64 ) { $shippingCosts = $shipRolle; }
       elsif ( ( $picOptions->[ 5 ] > 32 ) && ( $picOptions->[ 5 ] < 65 ) ) { $shippingCosts = $shipMaxi; }
       else { $shippingCosts = $shipKompakt; }
   }

   elsif ( $picOptions->[ 4 ] || $picOptions->[ 12 ] ) {

       my $pictureNr =  $picOptions->[ 4 ] + $picOptions->[ 12 ];
       if ( $pictureNr > 160 ) { $shippingCosts = $shipRolle; }
       elsif ( ( $pictureNr > 87 ) && ( $pictureNr < 161 ) ) { $shippingCosts = $shipMaxi; }
       else { $shippingCosts = $shipKompakt; }
   }

   elsif ( $picOptions->[ 3 ] || $picOptions->[ 2 ] || $picOptions->[ 1 ] || $picOptions->[ 10 ] || $picOptions->[ 10 ] ) {

       my $pictureNr =  $picOptions->[ 3 ] + $picOptions->[ 2 ] + $picOptions->[ 1 ] + $picOptions->[ 10 ] + $picOptions->[ 11 ];

       if ( $pictureNr > 160 ) { $shippingCosts = $shipRolle; }
       elsif ( ( $pictureNr > 149 ) && ( $pictureNr < 161 ) ) { $shippingCosts = $shipMaxi; }
       elsif ( ( $pictureNr > 13 ) && ( $pictureNr < 150 ) ) { $shippingCosts = $shipGross; }
       elsif ( ( $pictureNr > 4 ) && ( $pictureNr < 14 ) ) { $shippingCosts = $shipKompakt; }
       else { $shippingCosts = $shipStd; }

   }

   else { $shippingCosts = $shipKompakt; }

   # 2 Nachkommastellen erzeugen, falls nur eine da
   if ( $shippingCosts =~ /\.\d$/ ) {
       $shippingCosts = $shippingCosts."0";
   }
   if ( $shippingCosts =~ /^\d$/ ) {
       $shippingCosts = $shippingCosts.".00";
   }

   return ( $shippingCosts );

} # calculateShipping()


Nur, was gefällt Perl daran nicht, so dass es ohne Fehlermeldung hängen bleibt?
renee
 2004-05-10 00:05
#2370 #2370
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mach zweischendurch immer wieder mal Ausgaben nach dem Muster
Code: (dl )
1
2
3
if($bedingung){
print $bedingung,"\n";
}

Dann weißt Du schon mal, in welche if-Bedingung Du rein kommst...

Und das Formatieren auf 2 Nachkomma stellen
Code: (dl )
1
2
3
4
5
6
7
   # 2 Nachkommastellen erzeugen, falls nur eine da
if ( $shippingCosts =~ /\.\d$/ ) {
$shippingCosts = $shippingCosts."0";
}
if ( $shippingCosts =~ /^\d$/ ) {
$shippingCosts = $shippingCosts.".00";
}


kannst Du so einfacher schreiben:
Code: (dl )
$shippingCosts = sprintf("%.2f",$shippingCosts);

Macht genau das, was du willst...
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/
Gast Gast
 2004-05-10 00:47
#2371 #2371
ich denke hier liegt der Hase im Pfeffer:
my ( $picOptions ) = @_;
kann nur funktionieren wenn @_ eine Referenz ist oder $_[0] eine Referenz ist.
bony
 2004-05-10 01:13
#2372 #2372
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke für den Tip für das Formatieren der Nachkommastellen.

Wie ich die Skriptkontrolle per Print-Befehl mach soll, verstehe ich nicht ganz, weil Perl sich aufhängt, bevor ich zu irgendeiner Ausgabe komme. D.h. ich schicke das Formular ab und der Bilschirm "bleibt so hängen". Wenn ich dann Perl über den Task-Manager kille, kommt natürlich ein Internal Server Error. Das liegt vielleicht auch daran, dass ich HTML::Template einsetze; das Skript wird also erst ganz durchlaufen, die zur Ausgabe nötigen Variablen werden gesammelt und erst ganz am Schluss erfolgt die Ausgabe.

@ Dieter:
Um hier das Problem zu sehen, reichen meine Informatik-Kenntnisse leider nicht aus ;-). Normalerweise funktioniert das ganze ja. Nur hier nicht bei zweimaligem Aufruf.

Der Aufruf sieht folgendermaßen aus:
Quote
# Bestelldaten ändern
elsif ( $cgi->param( 'updateOrder' ) ) {

   my ( $updateCartError ) = updateCart( $dbh, $cgi );

   unless ( $updateCartError eq "noNumber" ) {
       updateOrder( $dbh, $cgi );
   }

   displayProfile( $dbh, $cgi, $sh );

} # elsif updateOrder

Obige Berechnung wird in updateOrder() durchgeführt und danach in der Ausgabe-Funktion displayProfile(). Wenn ich displayProfile() nicht ausführe, läuft das Skript durch.
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2004-05-09 17:58.