Schrift
[thread]9007[/thread]

Konstanten aus der Datenbankdaten erzeugen



<< >> 10 Einträge, 1 Seite
mordur
 2007-05-14 16:57
#76697 #76697
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich bin dabei ein Skript zu erweitern. Im Skript sind verschiedene Konstanten fest codiert. Anhand derer werden dann Geräte im NEtz via snmp abgefragt. D.h. die Konstanten enthalten eine OID.

Da aber eventuell auch mal andere OID abegfragtw erden sollen, sollen die jetzt in einer DB gepflegt werden.

Bis jetzt steht im Skript dies:

Code: (dl )
use constant RESET => '1.3.6.2.3.2.3.5.6.3.2.2';


Nun soll etwas derart da stehen:
Code: (dl )
use constant $nameAusDatenbank=>'$wertzuNameAusDatenbank';


Ist das überhaupt machbar? Kann man eine Konstante variabel bezeichnen?
nepos
 2007-05-14 17:14
#76698 #76698
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, wieso willst du dafür Konstanten benutzen?
In deinem Fall würde ich das einfach in einen Hash einlesen, denke, das ist einfacher und sinniger.
mordur
 2007-05-14 18:07
#76699 #76699
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja das habe ich nun auch getan. Ich wollte mir nur die Arbeit ersparen all die vielen Konstantennamen im Skript in Hashvaraiblen umzubenennen. Prinzipell würde mich trotzdem interessieren ob das geht:
Code: (dl )
1
2
3
my $konst ='RESET';

use $konst => '1.3.6.2.3.4.5.6.2.2.1';
GwenDragon
 2007-05-14 19:31
#76700 #76700
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
[quote=mordur,14.05.2007, 16:07]würde mich trotzdem interessieren ob das geht:
Code: (dl )
1
2
3
my $konst ='RESET';

use $konst => '1.3.6.2.3.4.5.6.2.2.1';
[/quote]
Du meinst sowas?
my $konst ='RESET';
use constant $konst => '1.3.6.2.3.4.5.6.2.2.1';

Nein. Konstanten werden nicht zur Laufzeit erzeugt.
pq
 2007-05-14 21:47
#76701 #76701
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
der sinn von konstanten ist ja, dass sie beim kompilieren schon ersetzt
werden. benutz doch hier stattdessen CPAN:Readonly
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
Strat
 2007-05-20 12:14
#76702 #76702
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
mordur: man koennte sowas notfalls tatsaechlich zur Laufzeit machen, indem man use constant rauskickt und stattdessen mit dem Ergebnis der Datenbankabfrage eine Subroutine der Form
Code: (dl )
1
2
3
sub NameDerKonstante () {
return $wertDerKonstante;
}

on-the-fly generiert.

dadurch gewinnt man jedoch nicht wirklich was. ich empfehle, die Konstante rauszukicken und stattdessen eine Variable mit CPAN:Readonly zu verwenden (meinetwegen eine Globale) und mit Search&Replace alles ersetzen. Dauert auch nicht so lange, und ist wesentlich sauberer, weil es den Programmierer, der das Programm mal wartet, sonst voellig verwrirrt.\n\n

<!--EDIT|Strat|1179648908-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2007-05-20 12:30
#76703 #76703
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Allerdings ist dann die Verwendung von "Konstanten" mit Readonly langsamer.
Strat
 2007-05-20 14:15
#76704 #76704
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
genau; bei der generierung der subs (den schlechten weg, den ich oben beschrieben habe) wird's ebenso langsamer.

Ist halt die Frage Flexibilitaet (Werte aus einer Datenbank beziehen) gegenueber Laufzeit, wobei der Unterschied constant / Readonly fuer ein paar Variablen wohl einen kaum messbaren Laufzeitunterschied ausmachen duerfte...

Ich persoenlich finde Readonly auch besser als use constant, weil ( ausser vielleicht in sehr kleinen Scripten) Variablen komfortabler verwendbar sind als Konstanten, was IMHO den meist kaum merkbaren Laufzeitunterschied mehr als Kompensiert, z.B.
Code: (dl )
1
2
print "Value ist: @$MyApp::Config::Values\n";
print "Value ist: ", @{ &MyApp::Config::VALUES }, "\n";
\n\n

<!--EDIT|Strat|1179656210-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
nepos
 2007-05-20 14:18
#76705 #76705
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Frage mich nur, was der Vorteil ist, das als Konstanten zu definieren, wenn man es dynamisch aus der Datenbank ausliest.
Strat
 2007-05-21 01:04
#76706 #76706
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@nepos: ich sehe keinen... die paar bereits im code vorhandenen konstanten kann man ja in sehr kurzer zeit "entkonstantisieren"
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2007-05-14 16:57.