Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11210[/thread]

Umgang mit projektweiten Konstanten

Leser: 2


<< >> 5 Einträge, 1 Seite
gkaiser
 2008-01-29 15:30
#105322 #105322
User since
2007-06-21
4 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich realisiere z.Zt. ein größeres Projekt in Perl und würde gerne mal eure Meinung zum Umgang mit projektglobalen Konstanten wissen.

Zur Zeit habe ich es folgendermaßen realisiert:

In einem Modul GlobalConstants.pm definiere ich die projektweiten Konstanten - hier ein Auszug

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package GlobalConstants;
use strict;
use warnings;

use vars qw(@ISA @EXPORT_OK);
use Exporter;
@ISA = ('Exporter');

@EXPORT_OK = qw(
&$XML_FILE_EXTENSION
&$ZIP_FILE_EXTENSION
&$JAR_FILE_EXTENSION
);

*XML_FILE_EXTENSION = \".xml";
*ZIP_FILE_EXTENSION = \".zip";
*JAR_FILENAME_EXT = \".jar";

1;


In den anderen Moduln spreche ich sie dann wie folgt an (Bsp):
Code: (dl )
1
2
3
use GlobalConstants;

_fileCopy($fileName,$srcDir,$dstDir) if ($fileExt eq $GlobalConstants::XML_FILE_EXTENSION);


Ist das ein sinnvolles Vorgehen? Gibts ein anderes, besseres, perl likeres Vorgehen?

Danke im Voraus
Gaston
MatthiasW
 2008-01-29 17:42
#105326 #105326
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Ich benutze für Konstanten immer folgendes:
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
package XXX; # fuer XXX den Namen des package einsetzen

use strict;
use warnings;

my %ERROR = (
# Fehlerkonstanten
);

my %CONST = (
# andere Konstanten
);

sub import
{
my( $class ) = caller( @_ ); # uebergeordneten packagenamen holen

no strict; # strict abschalten
*{$class.'::error'} = sub (*) { $ERROR{$_[0]} }; # error() sub im uebergeordneten package erstellen
*{$class.'::const'} = sub (*) { $CONST{$_[0]} }; # const() sub im uebergeordneten package erstellen
} # import

22;

__END__

Im Skript kann man dann einfach mittels 'use XXX' die Konstanten einbinden, welche dann über die Funktionen const() und error() im aktuellen package verfügbar sind.

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl

use strict;
use warnings;

use XXX; # XXX wieder ersetzen

print const HALLO;
do_something() or die error 1001;

HALLO müsste natürlich vorher in %XXX::CONST und 1001 in %XXX::ERROR definiert worden sein.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
pq
 2008-01-29 18:52
#105328 #105328
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
für string-konstanten würde ich wenn möglich immer eine config nehmen, etwa
CPAN:Config::Inifiles.
und ich frage mich, was das &$VAR und *VAR soll. kannst du nicht einfache skalare
exportieren statt typeglobs setzen?
Code (perl): (dl )
1
2
our ($FOO, $BAR);
our @EXPORT_OK = qw/ $FOO BAR /;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Struppi
 2008-01-29 19:03
#105330 #105330
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ich mach das momentan so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
package My::Constants;

use base 'Exporter';
use constant TRUE       => 1;
use constant FALSE      => 0;
use constant NL      => "\n";
use constant NULL   => "\0";

our @EXPORT = qw(TRUE FALSE NL NULL);
1;
Strat
 2008-01-31 13:47
#105384 #105384
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich verwende häufig den folgenden Weg:

Ich erstelle mir ein Modul namens MyApp::Config (oder aehnlich), das entweder als Schnittstelle zu textbasierten Konfigurationsdateien (z.B. INI oder YAML) dient (oder auch zu einer DB, in der die Konfig abgelegt ist) oder eventuell auch die Konfiguration enthält.

In diesem Modul verwende ich dann Readonly-Packagevariablen, z.B.
Code (perl): (dl )
1
2
3
4
5
use File::Spec;
use Readonly;
use vars qw( $DataPath );
....
Readonly::Scalar $DataPath => File::Spec->catdir( $FindBin::Bin, 'data' );

und verwende die dann im Programm oder anderen Modulen mit vollem Namen, z.B. $MyApp::Config::DataPath.

Die Kombination Constants/Export finde ich aber auch sehr gut, und sie ist wohl weniger Tipparbeit. Nur muss da das Modul in jeder Datei geladen werden, in der die Konfig-Konstanten verwendet werden (oder zumindest ein -f import muss gemacht werden.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 5 Einträge, 1 Seite



View all threads created 2008-01-29 15:30.