Leser: 23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
my %map = ( ">" => sub { return $_[0] > $_[1] }, "<" => sub { return $_[0] < $_[1] }, # ... ); my $value = 23; my $compare = 24; my $condition = "<"; print test(23, "<", 24); sub test { my ($value, $cond, $compare) = @_; my $func = $map{$cond} or die "No function for $cond"; return $func->($value, $compare) ? "true" : "false"; }
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
# Eine DispatchTabelle die zu einem "Befehl" # (hier sind es Vergleichsoperationen) eine Funktion bestimmt, # die ausgeführt werden soll. # jede Funktion hat zwei übergebene Parameter (in @_), # die logisch miteinander verknüpft werden. # Das Ergebnis wird zurück geliefert. # hier als Beispiele sind "numerisch Kleiner" (<) # und "numerisch Größer" (>) implementiert my %map = ( ">" => sub { return $_[0] > $_[1] }, "<" => sub { return $_[0] < $_[1] }, # ... ); # Beispielwerte my $value = 23; my $compare = 24; my $condition = "<"; # Hier wird die unten definierte Funktion "test" # mit den vordefinierten Werten ausgeführt. print test($value, $condition, $compare); sub test { # Die funktion "test" übernimmt drei Werte my ($value, $cond, $compare) = @_; # $cond ist der oben übergebene Wert aus "$condition" # der Beispielhaft mit "<" belegt wurde. # Es wird geprüft ob "$cond" als Schlüssel im Hash "$map" # (die DispatchTabelle) einen wert hat # und dieser wird der Variable "$func" übergeben. # wenn es kein wahrer Wert ist, # stirbt das Script mit "die". # (Eine funktions-referenz ist wahr "undef" ist es nicht) my $func = $map{$cond} or die "No function for $cond"; # die Funktion wird mit den übergebenen Werten "$value" und "$compare" ausgeführt # und das Ergebnis zurück geliefert. return $func->($value, $compare) ? "true" : "false"; }
"<" => sub { return $_[0] < $_[1] },
"help|h" => sub{ Usage(); },
2010-07-31T09:06:13 jan999Ja zwischen den Klammern kannst du ganz normal programmieren. Es ist eine Funktion.wenn ich es dann richtig verstehe steht in den {} von
Code (perl): (dl )"<" => sub { return $_[0] < $_[1] },
die Mini-Subfunktion und dort könnte ich auch die anderen Formatierungen für !=, = etc. unterbringen.
2010-07-31T09:06:13 jan999Ja. Aber denke an die Übergabe der Werte.Wenn tiefgehendere Prüfungen in den Mini-Subs erforderlich sind, dann trage ich stattdessen dort den Funktionsnamen wie bei
Code (perl): (dl )"help|h" => sub{ Usage(); },
ein ???
1 2 3 4
my %map = ( '!' => \&teste_ob_nicht_gleich, '=' => sub{ return teste_ob_gleich(@_); }, );
"help|h" => sub{ Usage(); },