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

bianca
 2010-10-24 14:05
#142143 #142143
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
2010-10-24T11:29:54 renee
Das "vorbei kommt" ist missverständlich. Ein use wird *nicht* zur Laufzeit ausgeführt, sondern zur Compile-Zeit.

Das use an den Anfang der sub, ist das besser?
Dann müsste es zur Compile-Zeit immer erreicht werden oder?

Danke

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
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);
            },
    };
}


Edit: Aktueller code
Last edited: 2010-10-24 14:15:06 +0200 (CEST)
10 print "Hallo"
20 goto 10

View full thread Syntaxcheck sub in hash