Schrift
[thread]5627[/thread]

Constants in Libs

Leser: 1


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
esskar
 2003-08-09 01:43
#58510 #58510
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Hi...

folgende Verzeichnisstruktur

/
/Lib
/Lib/AI
...

in / liegen alle meine Scripte (*.pl);
in /Lib liegen alle meine Libs (*.pm), wie z.b. Vars.pm

Vars.pm sieht z.b. so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Lib::Vars;

use strict;
use vars qw/@ISA @EXPORT $VERSION/;

require Exporter;
require SelfLoader;

$VERSION = 1.00;
@ISA = qw/Exporter SelfLoader/;

use constant CONST1 => 1;
use constant CONST2 => 2;
use constant CONST3 => 3;
use constant CONST4 => 4;

1;


ein script im / z.b. so:

Code: (dl )
1
2
3
4
5
use strict;

use Lib::Vars;

print Lib::Vars::COUNT1;


geht es auch irgendwie anders? kürzer? am besten mit Vars::COUNT1 ! den namensraum will ich mir nämlich nicht versauen!
Relais
 2003-08-09 01:48
#58511 #58511
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
CONST* oder COUNT*?

Wie bei einem Hash geht's noch:
Code: (dl )
1
2
3
4
5
6
use constant {
CONST1 => 1,
CONST2 => 2,
CONST3 => 3,
CONST4 => 4,
}

Edit: versehentlichen Fullquottel gelöscht.\n\n

<!--EDIT|Relais|1060379390-->
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
esskar
 2003-08-09 01:51
#58512 #58512
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
CONST1

als hash geht es erst ab ner höheren version...
das kennen die bei 1und1 noch nicht...

die Vars.pm ist mir egal...
mich stört das Lib vor Vars in den Scripten

also anstatt Lib::Vars::CONST1 würde ich lieber Vars::CONST1 schreiben...
esskar
 2003-08-09 01:54
#58513 #58513
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
habs grad selber gelöst...

im script

Code: (dl )
1
2
3
4
5
BEGIN
{
use FindBin;
use lib ("$FindBin::Bin/Lib");
}


und in in Vars.pm

Code: (dl )
package Vars;


naja...
geht es jetzt auch noch ohne BEGIN ?
Crian
 2003-08-09 02:03
#58514 #58514
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
ja, lass das BEGIN einfach weg :-)
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
esskar
 2003-08-09 02:06
#58515 #58515
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Crian,09.08.2003, 00:03]ja, lass das BEGIN einfach weg :-)[/quote]
quatsch... dann kommt doch der folgende fehler

Quote
Can't locate Vars.pm in @INC (@INC contains: F:/Perl/lib F:/Perl/site/lib .) at H:\Eigene Dateie
n\Entwicklung\Webdesign\YourNation.de\setup.pl line 9.
BEGIN failed--compilation aborted at H:\Eigene Dateien\Entwicklung\Webdesign\YourNation.de\setup.pl
line 9.
Relais
 2003-08-09 02:13
#58516 #58516
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
dann nimm ein use lib dazu...
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
pq
 2003-08-09 02:29
#58517 #58517
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
[quote=esskar,08.08.2003, 23:54]geht es jetzt auch noch ohne BEGIN ?[/quote]
nein...
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
esskar
 2003-08-09 02:37
#58518 #58518
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
so würde es gehen:

Code: (dl )
1
2
3
package Vars;
...
1;


dann

Code: (dl )
1
2
3
use Lib::Vars;

print Vars::CONST1;


aber ob das so schick ist!
kabel
 2003-08-09 09:01
#58519 #58519
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
du könntest per Exporter die konstant-funktionen in den namespace des callers transferieren. vorteil: du musst nur die konstantennamen selber schreiben. nachteil: "namespace-pollution". ist das überhaupt keine option? wozu brauchst du den Exporter überhaupt? wird da schon was exportiert?

ich hab gerade probiert, die subroutine main::AUTOLOAD als dispatcher einzusetzen, es ist nicht wirklich schön (ach ja, fehlerabfrage ade ;) ):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;

package Lib::Vars;
use constant HI => "HO";

package main;
use vars qw/ $AUTOLOAD /;

print "HI", &HI, "\n";;

sub AUTOLOAD {
my $sub = $AUTOLOAD;
$sub =~ s/\w*::(\w*?)$/$1/;
$sub = "Lib::Vars::$sub";
goto &$sub;
}


du kannst konstanten übrigens auch anders erzeugen:
Wie verwende ich Konstanten?
- ex::constant::vars ist eine lösung auf tie-basis.
- zuweisung einer skalarreferenz an einen typeglob.

(ja, ich weiss, bei constant.pm stimmt einiges net, mit dem wiki wird alles viel besser, hoffentlch! 8) )
-- stefan
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2003-08-09 01:43.