Schrift
[thread]6378[/thread]

Konstanten generieren



<< >> 4 Einträge, 1 Seite
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-->
Crian
 2004-07-05 14:57
#83878 #83878
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Schicker Ansatz. Ich hätte wahrscheinlich so etwas ähnliches gemacht, ohne YAML.

(((In Deinem Codebeispiel oben fehlt ein schließendes Hochkamma hinter yada...)))

Vielleicht sollte ich mir das Modul mal ansehen.

Brauchen wir einen Meditations-Thread? =) (noch nicht)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-07-05 15:05
#83879 #83879
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
YAML und Perl-Datenstrukturen lassen sich 1:1 ueberfuehren. In sris Beispiel koennte man anstelle des Loads und des _ _ DATA _ _-Bereichs einfach folgendes schreiben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
local $_ = {
tests => {
TEST => 123,
TSET => 321,
},
foos => {
FOO => 'bar',
BAR => 'yada',
}
};


Aber in einer Multi-Sprachen-Umgebung ist der Einsatz von YAML durchaus sinnvoll.
Crian
 2004-07-05 15:13
#83880 #83880
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Ah danke, wieder etwas gelernt :-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 4 Einträge, 1 Seite



View all threads created 2004-07-05 14:15.