Thread Syntaxcheck sub in hash (12 answers)
Opened by bianca at 2010-10-24 10:48

bianca
 2010-10-24 10:48
#142139 #142139
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Guten Morgen!

Ich möchte gern in einer zentralen Konfigurationsdatei mehrere Ausführungsrhythmen für Daueraufträge definieren und von mehreren Programmen aus darauf zugreifen können.
Unter anderem soll auch die jeweilige Berechnung des nächsten Ausführungsdatums in diesem zentralen Hash gespeichert werden.

Habe dafür folgendes erstellt und möchte Euch bitten, mal mit drüber zu schauen, ob das perlig und syntaktisch OK ist (auch das Ampersand als Aufruf für die sub im Hash OK so?). Es funktioniert und wirft auch keinen Fehler aber ich traue an der Stelle meinen eigenen Künsten noch nicht so recht :)

Insbesondere beschäftigt mich die Frage, an welcher Stelle ich Date::Calc korrekt "usen" muss. Im unteren Beispiel funktioniert nämlich jährlich genauso wie monatlich obwohl Date::Calc nur bei monatlich geuset wird. Warum ist das so?

Danke Euch

Code (perl): (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
#!/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;
            },
    );
}
10 print "Hallo"
20 goto 10

View full thread Syntaxcheck sub in hash