Thread Konstanten generieren (3 answers)
Opened by sri at 2004-07-05 14:15

sri
 2004-07-05 14:15
#83877 #83877
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

Dies ist heute mehr eine Meditation als eine Frage. ;)

Ihr kennt das sicher, euer Projekt wird grösser, ihr habt jede Menge Konstanten so das ihr ihnen ein eigenes Modul widmet.

Leider sieht das ganze meist so aus:
Code: (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
package MyConstants;

use strict;
use base 'Exporter';

use constant {
TEST => 123,
TSET => 321,
FOO => 'bar',
BAR => 'yada
}

my @tests = qw(
TEST
TSET
);
my @foos = qw(
FOO
BAR
);

our @EXPORT_OK = (@tests, @foos);
our %EXPORT_TAGS = (
all => @EXPORT_OK,
tests => @tests,
foos => @foos
);

1;


Nicht sehr elegant, Konstanten müssen mehrfach geschrieben werden, die Pflege wird mühsam...etc.

Um das ganze etwas hübscher zu machen bin ich zu einer Lösung mit YAML gekommen.

Das hat dann noch den Vorteil das die Konstanten in einer sprachunabhängigen Form vorliegen, was später beim portieren sehr hilfreich sein kann.

Das sieht dann etwa so aus:
Code: (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
package MyConstants;

use strict;
use base 'Exporter';
use YAML;

our ( @EXPORT_OK, %EXPORT_TAGS );
$_ = Load do { local $/; <DATA> };
while ( my ( $tag, $consts ) = each %$_ ) {
while ( my ( $const, $val ) = each %$consts ) {
push @$_, $const
for ( \@EXPORT_OK, \@{ $EXPORT_TAGS{$tag} },
\@{ $EXPORT_TAGS{all} } );
no strict 'refs';
*$const = sub () { $val };
}
}

1;
# hier sollte eigendlich DATA beginnen, wird aber immer wieder vom Forum verschluckt :(
# unterstrichunterstrichDATAunterstrichunterstrich
tests:
TEST: 123
TSET: 321
foos:
FOO: bar
BAR: yada


Vielleicht hat ja jemand noch ein paar Verbesserungsvorschläge, oder gar eine bessere Lösung?\n\n

<!--EDIT|sri|1089026761-->

View full thread Konstanten generieren