Die
set_business_days() wird aufgerufen, um die Geschäftstage zu setzen. In diesem Fall ist der Aufruf nicht wirklich notwendig, weil der Hash
%business_days bereits mit den gleichen Werten schon vorbelegt ist.
Aber der Aufruf sollte eher aufzeigen, wie man die Geschäftstage (neu) definieren/festlegen kann.
Da mein Gedanke war, dass ganze als Methoden von DateTime zu implementieren, beginnen die beiden Methoden eben mit
my $self = shift;. Auch wenn
$self nicht verwendet wird, würde ich das so stehen lassen. Aus zwei Gründen:
1. Beim Methodenaufruf wird das Objekt, für das die Methode aufgerufen wird, als erstes Argument übergeben. Durch die Zeile ist das erste Argument abgearbeitet und aus der Argumentliste entfernt und man kann sich den restlichen Argumenten zuwenden.
2. Sollte die Methode später mal überarbeitet werden, ist das
$self schon deklariert und definiert...
Die Reihenfolge der Aufrufe resultiert daraus, dass ich erstmal ein neues DateTime-Objekt erzeuge, für das ich dann die Methoden aufrufen will. Mein erster Ansatz sah vor, dass ich die Geschäftstage pro erzeugten DateTime-Objekt definieren wollte.
Also erst das Objekt mit DateTime->now( ... ) erzeugen und dann die Geschäftstage definieren.
Da aber mein erster Versuch, die Daten ins DateTime-Objekt selber zu legen, fehlschlug, ist das nicht mehr ganz so klar und deutlich.
Sorry. Also könnte man das auch einfach vom DateTime lösen; vielleicht wird es damit klarer?
Die Funktionen sind im folgenden Beispiel von DateTime losgelöst; dafür muss das Ergebnis von
$day1->wday nun als Argument an
is_business_day() übergeben werden.
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
use strict;
use warnings;
use DateTime;
{
my %business_day;
@business_day{1..5} = (1)x5;
sub set_business_days {
%business_day = ();
$business_day($_} = 1 for @_;
}
sub is_business_day {
my $wday = shift;
return 1 if $business_day{$wday};
return 0;
}
}
set_business_days( 1..5 );
my $day1 = DateTime->now( time_zone => 'Europe/Berlin' );
my $add = 7;
while ( $add ) {
$day1->add( days => 1 );
$add-- if is_business_day( $day1->wday );
}
print $day1->ymd, $/;
Last edited: 2013-07-22 20:35:09 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!