Schrift
[thread]6341[/thread]

abgedrehtes problem mit switch: oder bin ich blind? (Seite 2)



<< |< 1 2 3 4 5 ... 8 >| >> 72 Einträge, 8 Seiten
deepblack
 2004-06-17 15:55
#83440 #83440
User since
2004-06-15
46 Artikel
BenutzerIn
[default_avatar]
ich nehm die hash version, die sieht auch so nett aus *g* danke für die tips jungs ;)
We have joy, we have fun, we have a root shell on a SUN!
steffenw
 2004-06-17 16:10
#83441 #83441
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Man muß bei if ... elsif ... else nicht jede Bedingung einzeln ausformulieren. Man kann auch gut gruppieren und während des Testens der Bedingung Variablen/Merker setzen. Hier ein primitives Beispiel:
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
#!perl
# Beispiel - prüfen von Kommandos
use strict;
use warnings;

sub check_command {
if ((local $_ = shift) eq 'end') {
# Ende Nutzdaten
return '';
}
elsif (
# Kommandos verarbeiten
/^set\s+nr\s*=\s*(\d+)$/
or
/^set\s+typ\s*=\s*"([^"]+)"$/ and my $typ_flag = 1
) {
# verarbeitendes Programm für alle "set"-Kommandos
print $typ_flag ? qq~Typ "$1"~ : "Nummer $1", " wird gesetzt.\n";
} else {
# Fehlerbehandlung
return qq~Unbekanntes Kommando "$_" entdeckt.\n~;
}
undef;
}

for (
'set nr = 123',
'set typ="S4 Q"',
'Hallo',
'end',
'next',
) {
my $rc = check_command $_;
$rc and print "ERROR: $rc";
defined $rc and last;
}



Ergebnis:

Nummer 123 wird gesetzt.
Typ "S4 Q" wird gesetzt.
ERROR: Unbekanntes Kommando "Hallo" entdeckt.
$SIG{USER} = sub {love 'Perl' or die};
ptk
 2004-06-17 17:16
#83442 #83442
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Dieter,17.06.2004, 13:15][Der Hash wird (gewöhnlich) bei jedem Durchlauf neu aufgebaut (unter mod_perl natürlich nicht).[/quote]Warum sollte das bei mod_perl anders sein? Und die Ausgabe von
Code: (dl )
perl -MO=Concise -e 'for (1..10) { my $y = {1=>2,3=>4}; $y->{$x} }'
interpretiere ich dahingehend, dass doch jedesmal der Hash neu aufgebaut wird --- es sei denn, man legt ihn global oder als Konstante ab.

Quote
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).
Benchmark?

Quote
Aber mal davon abgesehen ...
jede ernstzunehmende Perl-Literatur distanziert sich in aller Form vom Einsatz eines if-elsif-Blocks.
Meinst du den Einsatz des Wortes "horrors" in perlsyn.pod? Naja, trotzdem gilt TIMTOWTDI.

Quote
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.
Die Compilezeit halte ich fuer relativ irrelevant, perl compiliert grundsaetzlich sehr schnell.
Gast Gast
 2004-06-17 17:33
#83443 #83443
[quote=ptk,17.06.2004, 15:16][quote=Dieter,17.06.2004, 13:15][Der Hash wird (gewöhnlich) bei jedem Durchlauf neu aufgebaut (unter mod_perl natürlich nicht).[/quote]Warum sollte das bei mod_perl anders sein? Und die Ausgabe von
Code: (dl )
perl -MO=Concise -e 'for (1..10) { my $y = {1=>2,3=>4}; $y->{$x} }'
interpretiere ich dahingehend, dass doch jedesmal der Hash neu aufgebaut wird --- es sei denn, man legt ihn global oder als Konstante ab.

Quote
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).
Benchmark?

Quote
Aber mal davon abgesehen ...
jede ernstzunehmende Perl-Literatur distanziert sich in aller Form vom Einsatz eines if-elsif-Blocks.
Meinst du den Einsatz des Wortes "horrors" in perlsyn.pod? Naja, trotzdem gilt TIMTOWTDI.

Quote
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.
Die Compilezeit halte ich fuer relativ irrelevant, perl compiliert grundsaetzlich sehr schnell.[/quote]
Unter mod_perl bleibt der Hash (nach dem ersten Programmstart) bestehen; der if-elsif-Block natürlich auch.
Benchmark:
ist nicht erforderlich - der Zugriff auf ein Hash-Element ist 'immer' schneller als der Durchlauf eines if-elsif-Blocks.
Literatur:
z.B. Perl-Kochbuch
Compile-Zeit:
der Hash wird während der Compilierung aufgebaut
ptk
 2004-06-17 17:41
#83444 #83444
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Dann kommt deiner Ansicht nach hier bei beiden Hashes das gleiche heraus?
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
#!/usr/bin/perl

use Benchmark qw(cmpthese);

cmpthese(-1, {
hashsmall => sub {
my $x = {1 => "a",
};
},
hashlarge => sub {
my $x = {1 => "a",
2 => "b",
3 => "c",
4 => "b",
5 => "c",
6 => "b",
7 => "c",
8 => "b",
9 => "c",
10 => "c",
};
},
}
);
steffenw
 2004-06-17 18:14
#83445 #83445
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Der Hash ist schnell aber der Aufruf der sub dauert.

IF ... ist schnell, wenn man nach wahrscheinlicher Häufigkeit der Tests sortiert, damit eben nicht alles abgeklappert werden muß. Ich habe mal ein Programm von Hash/Sub wieder auf IF ... ELSIF zurück umgeschrieben, weil es nicht mehr aus dem Knick kam.

CASE ist in anderen Programmiersprachen auch nur so eine Abklappermethode, nur daß man sie schön strukturiert schreiben kann. Im Hintergrund wird pausenlos nur bedingt gesprungen und umsprungen. Eigenlich braucht man CASE in Perl nicht, weil es schnellere Methoden gibt.
$SIG{USER} = sub {love 'Perl' or die};
ptk
 2004-06-17 18:33
#83446 #83446
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=steffenw,17.06.2004, 16:14]CASE ist in anderen Programmiersprachen auch nur so eine Abklappermethode, nur daß man sie schön strukturiert schreiben kann. Im Hintergrund wird pausenlos nur bedingt gesprungen und umsprungen.[/quote]
Das muss nicht unbedingt sein --- wenn optimiert compiliert wird und der Wertebereich im switch es zulaesst, dann kann man auch in C feste Sprungtabellen bauen. Jedenfalls wuerde ich einen Compiler so programmieren :-)
Gast Gast
 2004-06-17 19:09
#83447 #83447
[quote=ptk,17.06.2004, 16:33]Jedenfalls wuerde ich einen Compiler so programmieren :-)[/quote]
Simply do it ;)
ptk
 2004-06-17 19:13
#83448 #83448
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Dieter,17.06.2004, 17:09][quote=ptk,17.06.2004, 16:33]Jedenfalls wuerde ich einen Compiler so programmieren :-)[/quote]
Simply do it ;)[/quote]
Ich bin zuversichtlich, dass die gcc-Leute es so gemacht haben. Leider ist meine Todo-Liste zu gross, um mich mit diesen Dingen zu beschaeftigen :-/
Dirk
 2004-06-18 00:54
#83449 #83449
User since
2004-06-18
3 Artikel
BenutzerIn
[default_avatar]
Und was ist mit labels ? :p
Soweit ich weiß wird das doch als switch ersatz empfohlen ?
SWITCH: if(){
if(){
last SWITCH;
}
}
mfg Dirk
use strict;
my @a =([0,0,1,0,0,0,1,0],[1,0,0,1,0,1,1,0],[0,1,0,0,1,1,1,0],[1,1,0,1,0,1,1,0]);for(my $b = 0; $b <= $#a;$b++){my $c = 1;my @d =@{$a[$b]};my $e;while(@d){my $f = shift(@d);if($f){$e += eval{my $g = 1;for (my $h = 1; $h < $c; $h++){$g *= 2;}return $g;};}$c++}print chr($e);}print "\n";
<< |< 1 2 3 4 5 ... 8 >| >> 72 Einträge, 8 Seiten



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