Leser: 16
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
#!/usr/bin/perl -w use strict; use warnings; use diagnostics; my %env; add_ausfuehrungsrhythmen (\%env); my $naechster = &{$env{ausfuehrungsrhythmus}{monatlich}{berechnung}}('24.10.2010'); print "Naechster: $naechster\n"; $naechster = &{$env{ausfuehrungsrhythmus}{jaehrlich}{berechnung}}('24.10.2010'); print "Naechster: $naechster\n"; sub add_ausfuehrungsrhythmen { my ($env) = @_; %{$env -> {ausfuehrungsrhythmus}{monatlich}} = ( anzeige => 'Monatlich', berechnung => sub { use Date::Calc qw ( Add_Delta_YMD ); my $letzte_ausf = shift; my $naechste = sprintf ('%02u.%02u.%04u', reverse Add_Delta_YMD (reverse (split /\./,$letzte_ausf),0,1,0)); return $naechste; }, ); %{$env -> {ausfuehrungsrhythmus}{jaehrlich}} = ( anzeige => 'Jährlich', berechnung => sub { my $letzte_ausf = shift; my $naechste = sprintf ('%02u.%02u.%04u', reverse Add_Delta_YMD (reverse (split /\./,$letzte_ausf),1,0,0)); return $naechste; }, ); }
$env -> {ausfuehrungsrhythmus}{monatlich}= {...}
$env{ausfuehrungsrhythmus}{jaehrlich}{berechnung}->(...)
2010-10-24T09:30:06 topegDas "vorbei kommt" ist missverständlich. Ein use wird *nicht* zur Laufzeit ausgeführt, sondern zur Compile-Zeit.use wird nur einmal falls möglich (außerhalb von string-eval) und ist dann im ganzen Script gültig, nur "export" wird immer wieder ausgeführt und exportiert Funktionen in den aktuellen Namespace. Das heißt du kannst das "use" fast überall einsetzen und es wird nur einmal geladen wenn perl daran "vorbei kommt".
2010-10-24T11:29:54 reneeDas "vorbei kommt" ist missverständlich. Ein use wird *nicht* zur Laufzeit ausgeführt, sondern zur Compile-Zeit.
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 71 72 73 74 75 76 77 78 79 80 81 82 83
#!/usr/bin/perl -w use strict; use warnings; use diagnostics; my %env; add_ausfuehrungsrhythmen (\%env); foreach my $datum ( '29.02.2008', # Test Schaltjahr '01.01.2010', # Extremwert '31.01.2010', # wg. Februar '31.12.2010', # Extremwert ) { print "\nDatum '$datum':\n"; foreach my $rhythmus ( sort {$env{ausfuehrungsrhythmus}{$a}{reihe} <=> $env{ausfuehrungsrhythmus}{$b}{reihe}} keys %{$env{ausfuehrungsrhythmus}} ) { print "Berechne '" . $env{ausfuehrungsrhythmus}{$rhythmus}{anzeige} . "' => " . $env{ausfuehrungsrhythmus}{$rhythmus}{berechnung} -> ($datum) . "\n" } } sub add_ausfuehrungsrhythmen { # # Fügt dem laufenden Hash %env alle Ausführungsrhythmen hinzu # # Aufruf: # ======= # add_ausfuehrungsrhythmen (\%env); # # - Zweite Dimension ist das dreistellige Kürzel für den Rhythmus # - Reihenfolge der Definition bestimmt die Anzeige für den User # my ($env) = @_; use Date::Calc qw ( check_date ); $env -> {ausfuehrungsrhythmus}{mtl} = { anzeige => 'Monatlich', reihe => (keys %{$env{ausfuehrungsrhythmus}}) + 1, berechnung => sub { my @wert = reverse (split /\./,shift); $wert[1] ++; # garantiert jeden Monat treffen, Add_Delta_YMD würde beim 31.01. den Februar überspringen if ($wert[1] > 12) { # Monatsüberlauf $wert[1] = 1; $wert[0] ++; } $wert[2] -- while !check_date (@wert); # Tag korrigieren, falls Monat kürzer als vorheriger return sprintf ('%02u.%02u.%04u', reverse @wert); }, }; $env -> {ausfuehrungsrhythmus}{qua} = { anzeige => 'Quartalsweise', reihe => (keys %{$env{ausfuehrungsrhythmus}}) + 1, berechnung => sub { my @wert = reverse (split /\./,shift); $wert[1] += 3; if ($wert[1] > 12) { $wert[1] = $wert[1] - 12; $wert[0] ++; } $wert[2] -- while !check_date (@wert); # Tag korrigieren, falls Monat kürzer als vorheriger (z.B. bei Schaltjahr 29.02.2008) return sprintf ('%02u.%02u.%04u', reverse @wert); }, }; $env -> {ausfuehrungsrhythmus}{jhr} = { anzeige => 'Jährlich', reihe => (keys %{$env{ausfuehrungsrhythmus}}) + 1, berechnung => sub { my @wert = reverse (split /\./,shift); $wert[0] ++; $wert[2] -- while !check_date (@wert); # Tag korrigieren, falls Monat kürzer als vorheriger (z.B. bei Schaltjahr 29.02.2008) return sprintf ('%02u.%02u.%04u', reverse @wert); }, }; }
1 2 3 4 5
#!/usr/bin/perl -w use strict; use warnings; use diagnostics; use Date::Calc qw /check_date/;
2010-10-24T09:30:06 topegWenn das wie ein "Plugin" funktionieren soll würde ich in jede Funktion das "use" packen um von der Reihenfolge unabhängig zu sein oder eine Funktion wie "init" erstellen, die zuerst und einmalig ausgeführt wird.
2010-10-24T09:30:06 topegIch würdees so schreibe, das finde ich übersichtlicher. Auch würde ich den Funktionsaufruf so schreiben:Code (perl): (dl )$env -> {ausfuehrungsrhythmus}{monatlich}= {...}Aber das ist reine Ästetik und hat nichts mit der Funktionstüchtigkeit zu tun.Code (perl): (dl )$env{ausfuehrungsrhythmus}{jaehrlich}{berechnung}->(...)
1
2
3
4
5
6
7
8
9
10
11
12
use Module VERSION LIST
use Module VERSION
use Module LIST
use Module
use VERSION
Imports some semantics into the current package from the named module, generally by
aliasing certain subroutine or variable names into your package. It is exactly
equivalent to
BEGIN { require Module; Module->import( LIST ); }
except that Module must be a bareword.