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

Switch

Leser: 2


<< >> 6 Einträge, 1 Seite
havi
 2003-10-02 12:30
#59949 #59949
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Hi!

Verwendet ihr eigentlich use Switch oder programmiert ihr euren Switch selbst ?

Beispiel fuer use Switch: (Auszug aus Switch.pm)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use warnings;
use strict;
use Switch;

switch ($val) {

  case 1          { print "number 1" }
  case "a"        { print "string a" }
  case [1..10,42] { print "number in list" }
  case (@array)   { print "number in list" }
  case /\w+/      { print "pattern" }
  case qr/\w+/    { print "pattern" }
  case (%hash)    { print "entry in hash" }
  case (\%hash)   { print "entry in hash" }
  case (\&sub)    { print "arg to subroutine" }
  else            { print "previous case not true" }

} # switch


Beispiele fuer selbst programmierten Switch
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl

use warnings;
use strict;

# Altvernative mit eval
# ~~~~~~~~~~~~~~~~~~~~~

my $key = 1;

my %switch = ( 1 => "f1('Hallo')",
               2 => "f2",
               3 => "f3",
);

print eval $switch{$key};

sub f1 {
  shift, "\n";
}

sub f2 {
  print "f2\n";
  return;
}

sub f3 {
  print "f3\n";
  return;
}

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# 1. Alternative ohne eval
# ~~~~~~~~~~~~~~~~~~~~~~~~

%switch = ( 1 => x1(1,3),
            2 => x2(2,3),
            3 => x3(3,3)
);

my $key1 = 1;

print $switch{$key1}."\n";

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# 2. Alternative ohne eval
# ~~~~~~~~~~~~~~~~~~~~~~~~

my $key2 = 2;

SWITCH:{
  if ($key2 == 1) { print x1($key2,10), "\n"; last SWITCH;}
  if ($key2 == 2) { print x2($key2,10), "\n"; last SWITCH;}
  if ($key2 == 3) { print x3($key2,10), "\n"; last SWITCH;}
}


sub x1 {
  $_[0] * $_[1];
}

sub x2 {
  $_[0] * $_[1];
}

sub x3 {
  $_[0] * $_[1];
}



Einfach mal aus Interesse gefragt!

Gruss\n\n

<!--EDIT|havi|1065083523-->
Geewiz
 2003-10-02 12:41
#59950 #59950
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das hängt meist davon ab, wie viele Alternativen es gibt. Da reicht mir oft auch eine elsif-Reihe. Aber bei 10 Alternativen wie bei deinem ersten Beispiel ist Switch sicher die beste Wahl.

Ansonsten bleibt ja nur Warten auf Perl6... :)
havi
 2003-10-02 12:50
#59951 #59951
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Sorry, aber das war nicht die Frage...

Die Frage war welche "Version" von Switch du verwendest!

Switch.pm oder einen selbst programmierten Switch!

... oder kennst du vielleicht Switch.pm noch gar nicht ?
Wenn nicht - schau mal hier: http://aspn.activestate.com/ASPN/Modules/dist_html?dist_id=9676

Gruss
Strat
 2003-10-02 12:50
#59952 #59952
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=havi,02.10.2003, 10:30][/quote]
Bei 1. Alternative ohne eval muss man sich halt bewusst sein, dass die Hashwerte von %switch die Returncodes der Funktionen sind, d.h. dass die Funktionen schon beim Programmstart ausgefuehrt werden.
Wenn sie erst spaeter ausgefuehrt werden sollen (z.B. zur Programmsteuerung), dann koenntest du dafuer Referenzen verwenden:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my %switch = ( 
1 => \&function1,
2 => \&function2,
4 => \&function3,
default => \&irgendwas,
);

my $key = 1;
if ($key and exists $switch{$key}) {
$switch{$key}->($params); # erst jetzt wird es ausgefuehrt
}
else { # default, wenn noetig
$switch{'default'}->($params);
}
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
format_c
 2003-10-02 12:57
#59953 #59953
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
use Switch. Ich habe das Modul mittlerweile echt zu schätzen gelernt.

Gruß Alex
havi
 2003-10-02 13:01
#59954 #59954
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Geht mir genauso!
Darum dachte ich, ich poste es mal!
Vielleicht kennen es ein paar Leute noch gar nicht!

Gruss
<< >> 6 Einträge, 1 Seite



View all threads created 2003-10-02 12:30.