Schrift
[thread]6341[/thread]

abgedrehtes problem mit switch: oder bin ich blind?



<< |< 1 2 3 4 ... 8 >| >> 72 Einträge, 8 Seiten
deepblack
 2004-06-16 21:56
#83430 #83430
User since
2004-06-15
46 Artikel
BenutzerIn
[default_avatar]
nabend,
also ich hab ma gerade noch n paar ifs in eine sub gebastelt und siehe da, beim ausführen kommt n sehr lustiger fehler den ich absolut nicht nachvollziehen kann:
Bad switch statement (problem in the code block?) near pmba.pl line 354
die zeilen:
Code: (dl )
1
2
3
4
5
6
switch($choice) {
case 'c' ....
..
..
case 'q' { &disconnect_db; print $clear; exit(); }
}


die sub wo ich die ifs reingepackt hab hat mir dem switch und den funktionen aber nix zu tun. das switch klappte vorher auch ohne probleme. ich hab keine ahnung was das sein kann, wenn jemand ne idee hat wär ich sehr glücklich *g*
mfg deep
We have joy, we have fun, we have a root shell on a SUN!
ptk
 2004-06-16 22:21
#83431 #83431
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Da Switch.pm mit einem Source-Filter arbeitet, ueberrascht es mich nicht, dass man mit zusaetzlichen Codezeilen Bugs triggern kann.
deepblack
 2004-06-16 22:28
#83432 #83432
User since
2004-06-15
46 Artikel
BenutzerIn
[default_avatar]
ok und lösung?
einfach auf switch verzichten und lieber if nehmen? oder irgendwas was eleganter ist?
We have joy, we have fun, we have a root shell on a SUN!
format_c
 2004-06-16 23:05
#83433 #83433
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
bei nicht übermäßig zu hohen Aufwand würde ich auch von Switch.pm abraten und es mit if und elsif machen. Switch ist einfach zu langsam.

Gruß Alex
ptk
 2004-06-17 00:19
#83434 #83434
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=deepblack,16.06.2004, 20:28]ok und lösung?
einfach auf switch verzichten und lieber if nehmen? oder irgendwas was eleganter ist?[/quote]
1. Bug (falls es einer ist!) einkreisen und einen Report an Damian Conway und/oder die Perl5-Porters schicken.
2. switch durch if ersetzen, auch wenn es nicht ganz so schoen aussieht. Oder in einfachen Faellen ein Hash mit Code-Referenzen verwenden:
Code: (dl )
1
2
3
4
{
'c' => sub { ... mach was fuer c ... },
'q' => sub { &disconnect_db; print $clear; exit(); },
}->{$choice}->();

Oder man nimmt den folgenden Trick, um eine if-elsif-Kette etwas ruhiger aussehen zu lassen (man beachte, dass alle Bedinungen auf der gleichen Spalte beginnen):
Code: (dl )
1
2
3
4
5
6
7
8
9
if      ($choice eq 'c') {
...
} elsif ($choice eq 'q') {
...
} elsif ($choice eq 'x') {
...
} else {
...
}
Um etwas Tipparbeit zu sparen, kann man ein
Code: (dl )
local $_ = $choice
am Anfang einfuegen und dann mit $_ arbeiten.
3. Auf perl6 warten, da gibt es ein richtiges switch.
Crian
 2004-06-17 00:44
#83435 #83435
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Und Du hast nicht zufällig irgendwo andern Klammern vergessen?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Gast Gast
 2004-06-17 00:58
#83436 #83436
[quote=ptk,16.06.2004, 22:19]
Oder man nimmt den folgenden Trick, um eine if-elsif-Kette etwas ruhiger aussehen zu lassen (man beachte, dass alle Bedinungen auf der gleichen Spalte beginnen):
Code: (dl )
1
2
3
4
5
6
7
8
9
if      ($choice eq 'c') {
   ...
} elsif ($choice eq 'q') {
   ...
} elsif ($choice eq 'x') {
   ...
} else {
   ...
}
[/quote]
Oh nein - nicht schon wieder diese unsägliche if-elsif-Geschichte.
Sowas kann man doch sehr elegant 'case-like' mit einem Hash erledigen (das ist dann auch bedeutent schneller als ein if-elsif-Block.
format_c
 2004-06-17 01:12
#83437 #83437
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Was sicher von der Menge der Möglichkeiten abhängt.

Aber eleganter ist es allemal. Vorallem find ich so onthefly Hashes so cool.

Gruß Alex
ptk
 2004-06-17 14:17
#83438 #83438
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Dieter,16.06.2004, 22:58]Oh nein - nicht schon wieder diese unsägliche if-elsif-Geschichte.
Sowas kann man doch sehr elegant 'case-like' mit einem Hash erledigen
[/quote]Habe ich in meinem Beitrag nicht ein Hash-Beispiel gebracht? Aber wenn es leicht komplizierter wird, dann kann man Hashes nicht mehr elegant verwenden.
Quote
(das ist dann auch bedeutent schneller als ein if-elsif-Block.
Schneller im Sinne von schneller hingeschrieben oder perfomanter? Da wuerde ich gerne Benchmarks sehen, ausserdem glaube ich nicht, dass man das so pauschal sagen kann --- es haengt wahrscheinlich von der Anzahl der Faelle ab. Ausserdem weiss ich nicht, ob so ein Hash als Konstante abgelegt wird oder bei jedem Durchlauf neu aufgebaut werden muss, was ein Pluspunkt fuer if-elsif-Bloecke waere.
Gast Gast
 2004-06-17 15:15
#83439 #83439
Code: (dl )
1
2
3
4
5
6
7
$foo = {
  'case1' => \&sub_1,
  'case2' => \&sub_2,
  'case3' => \&sub_3,
};

$foo->{$bar{'action'}}->();

Der Hash wird (gewöhnlich) bei jedem Durchlauf neu aufgebaut (unter mod_perl natürlich nicht).
Trotzdem läuft die 'case-like' Verzweigung per Hash, schneller als der if-elsif Block (es sei denn die erste if-Bedingung trifft sofort zu).
Aber mal davon abgesehen ...
jede ernstzunehmende Perl-Literatur distanziert sich in aller Form vom Einsatz eines if-elsif-Blocks.

Edit:
Wenn man mich fragen würde was schneller compiliert wird, ein if-elsif-Block oder ein Hash, so würde ich denn doch auf den Hash tippen.\n\n

<!--EDIT|Dieter|1087471321-->
<< |< 1 2 3 4 ... 8 >| >> 72 Einträge, 8 Seiten



View all threads created 2004-06-16 21:56.