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

FindBin in Modulen

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
pktm
 2008-10-13 21:54
#115474 #115474
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Es gibt ja FindBin, um eigene Module einzubinden.
Das geht aber immer vom aufrufenden Skript auf. Wenn sich der Pfad des Skripts nun ändert, wie greife ich dann aus einem selbst gebastelten Modul auf ein anderes, relativ verordnetes selbstgeschriebenes Modul zu?

Mal als konkretes Beispiel:
Ich habe ein Modul /mylib/a/b.pm liegen, und eines unter /mylib/c/d.pm.
Was muss ich schreiben, damit d.pm b.pm laden kann?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2008-10-13 23:00
#115477 #115477
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich würde FindBin nur in skripten verwnden, und zwar direkt am anfang.
in einem modul würde ich mich nie darauf verlassen.

auf module greifst du folgendermassen zu:
/pfad/zu/Das/Modul.pm
=>
use lib '/pfad/zu';
use Das::Modul;


irgendwelche pfadabhängigkeiten direkt im modul sind schlecht, da ja ein modul eben
'modular' sein soll, und das heisst auch überall einsetzbar.
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
pktm
 2008-10-14 00:01
#115481 #115481
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
pq+2008-10-13 21:00:56--
irgendwelche pfadabhängigkeiten direkt im modul sind schlecht, da ja ein modul eben
'modular' sein soll, und das heisst auch überall einsetzbar.


Ja, im Prinzip stimme ich dem voll und ganz zu. Nur, wie mache ich das, wenn ich Module habe, die ich nicht in @INC drin habe, weil ich sie selbst geschrieben habe?
Der Fall ist ja, dass ich welche selbst gebastelt habe, und das eine in dem anderen verwenden will. use ModuleA; geht ja in ModulB nicht, da ModulA nicht in @INC steht.

Wie machen andere das? Ich habe jetzt, so lange die Module alle in meinem Arbeitsbereich liegen, einen absoluten Pfad eingetragem, was zwar extrem hässlich ist, aber dafür beim Testen fürs release eher auffliegt, als alles mir bekannte andere.

Grüße, ptkm
http://www.intergastro-service.de (mein erstes CMS :) )
Linuxer
 2008-10-14 00:08
#115482 #115482
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

Code: (dl )
1
2
3
/mylib/a/b.pm 
/mylib/c/d.pm
/script.pl


innerhalb von script.pl sollte doch ausreichen:
Code: (dl )
1
2
use lib '/mylib';
use c::d;


dann sollte innerhalb von /mylib/c/d.pm das hier ausreichen:
Code: (dl )
use a::b;


Oder seh ich da was falsch?

Nachtrag:
Beispiel:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
~/a.pl:
---8<--
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;
use lib '/tmp';
use bar::foo;

bar::foo->hello();
__END__
---8<--

/tmp/foo/bar.pm:
---8<--
package foo::bar;

sub world {
return "world!";
}

1;
__END__
---8<--


/tmp/bar/foo.pm:
---8<--
package bar::foo;
use foo::bar;

sub hello {
print "hello ", foo::bar::world(), $/;
}

1;
__END__
---8<--

~$ perl ~/a.pl
hello world!
~$


Edit: Nachtrag angepasst; OO aus bar::foo entfernt.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
pktm
 2008-10-14 00:22
#115483 #115483
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Wie ich sehe reicht mein Beispiel nciht aus :-s
Hier die Originaldaten:

Ich habe da eine Sammlung von Modulen für mein Studium, bislang haben die sich gegenseitig nicht benötigt. Alles liegt in C:/Perl/Scripten/CL.

Dport gibt es die Projekte DBP, MYG, Pair, Semiringe und Tk_SyntaxTreeGraph.

Tk_SyntaxTreeGraph benutzt Semiringe. Semiringe benutzt Pair.

Die Ordnerstrukturen sehen jeweils so aus:
Tk_SyntaxTreeGraph/TK/lib/Tk/SyntaxTreeGraph.pm
Semiringe/Semiring-Tropical/lib/Semiring.pm
Pair/Pair/lib/Pair.pm

Da die Ordner Projekte repräsentieren liegen die Skripten, mit denen ich im jeweiligen projekt arbeite in den entsprechenden Ordnern.
Das Skript test_syntaxtreegraph.pl liegt also in TK_SyntaxTreeGraph,d as Skript test-SR.pl liegt in Semiringe.

test-SR.pl soll nun aber Pair verwenden. Das Probelm dabei steht schon oben.

Jetzt könnte man natürlich die Instanzen alle in ein verzeichnis packen, aber das würde mir zu unübersichtlich, habe ich doch stets an die 20 kleinere Dateien, und die auch noch nach einem gewohnten Schema benannt.
http://www.intergastro-service.de (mein erstes CMS :) )
Linuxer
 2008-10-14 00:31
#115485 #115485
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Ich seh da nur noch diese Alternativen:

1. Im Skript eine "use lib" Anweisung verwenden, die alle Verzeichnisse einbindet, in denen private Module liegen könnten.

2. Die Module "ordentlich" installieren. Dann sollten sie auch regulär benutzt werden können.

3. ein "private_libs" Verzeichnis, in dem die Module nebeneinander abgelegt werden; dieses wird dann im Skript mit "use lib" eingebunden.

Nachtrag:

4.
Die Verzeichnisse in einer Umgebungsvariable PERL5LIB definieren.
http://docs.activestate.com/activeperl/5.10/lib/po...
http://perldoc.perl.org/5.8.8/perlrun.html#PERL5LI...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
pktm
 2008-10-14 00:40
#115486 #115486
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hey, der Nachtrag gefällt mir echt gut :)
http://www.intergastro-service.de (mein erstes CMS :) )
Struppi
 2008-10-14 11:37
#115488 #115488
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Warum benutzt du so ein durcheinander? Module die für mehr als ein Projekt verwendet werden können sollten in einem der @INC Pfade liegen oder in _einem_ Modulverzeichnis. So wie du es machst ist es eher unüblich und erschwert das weitergeben von Skripten enorm.
pq
 2008-10-14 11:53
#115490 #115490
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
pktm+2008-10-13 22:01:01--
Ja, im Prinzip stimme ich dem voll und ganz zu. Nur, wie mache ich das, wenn ich Module habe, die ich nicht in @INC drin habe, weil ich sie selbst geschrieben habe?

ich sagte doch, use lib. hast du das noch nie verwendet, um @INC zu verändern? das ist
ein veränderliches array.
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
pktm
 2008-10-14 12:31
#115493 #115493
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
pq+2008-10-14 09:53:50--
pktm+2008-10-13 22:01:01--
Ja, im Prinzip stimme ich dem voll und ganz zu. Nur, wie mache ich das, wenn ich Module habe, die ich nicht in @INC drin habe, weil ich sie selbst geschrieben habe?

ich sagte doch, use lib. hast du das noch nie verwendet, um @INC zu verändern? das ist
ein veränderliches array.


Ja. Ich verwende das immer in Verbindung mit FindBin. Nur FindBin qw/$Bin/ gibt den Pfad relativ zur Instanz aus, und die kann auch mal wo anders liegen. Dann klappt das nicht mehr. Und die relativen Pfade mit lib wollen irgendwie nicht gehen, vllt. mache ich ja auch etwas falsch?

Aber zu Struppi: Dieses "Durcheinander" ist die Verzeichnisstruktur, wenn man seine Module nach Projekten ordnet und sie außerdem mit h2xs erstellt. Da sind dann nicht nur verschiedene Instanzen mit dabei (die ich mir selbst schreibe), sondern auch die Tests, Manifest usw.
Das Durcheinander wäre weg, würde ich Module releasen. Bislang hatte ich aber immer Gründe, es nicht zu tun.
http://www.intergastro-service.de (mein erstes CMS :) )
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2008-10-13 21:54.