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

Modul-Namespace geändert



<< >> 10 Einträge, 1 Seite
Robse
 2005-08-18 18:07
#47227 #47227
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Ich habe ein Modul mit

h2xs -n MySQLDB
perl Makefile.pl
make
make install

installiert. Alles läuft super. Jetzt wollte ich es aber
aus dem globalen Namespace rausnehmen und habe folgendes
versucht:

h2xs -n Dev::MySQLDB
perl Makefile.pl
make
make install

Den Namespace habe ich im Modul berücksichtigt:
Code: (dl )
package Dev::MySQLDB;

und im programm:
Code: (dl )
1
2
use Dev::MySQLDB;
my $dbobj = Dev::MySQLDB->new();

Jetzt bekomme ich aber folgende Fehlermeldung:

Can't locate auto/Dev/MySQLDB/new.al in @INC

Was ist da schiefgelaufen?\n\n

<!--EDIT|Robse|1124374122-->
Strat
 2005-08-18 18:20
#47228 #47228
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
liegt es im richtigen verzeichnis? das muss irgendeins sein das in @INC enthalten ist + Unterverzeichnis Dev. Wenn das korrekt ist, wird perl vermutlich mit autoloading durcheinanderkommen:

wenn du kein XS modul schreibst, dann: h2xs -X
wenn du Autoloading nicht benoetigst, dann hx2s -A
also in deinem Fall muss es vermutlich folgendermaszen heissen:
Code: (dl )
h2xs -X -A -n Dev::MySQLDB


nebenbei: mit perl Makefile.PL PREFIX=/path/to/my/temp/lib kannst du es in ein eigenes Lib-Verzeichnis installieren lassen... ist einfacher aufzuraeumen als das von Perl, weil man da nicht falsche dateien loeschen kann oder welche uebersieht, die in zukunft mal probleme bereiten... dort dann einfach alles loeschen\n\n

<!--EDIT|Strat|1124374852-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Robse
 2005-08-18 19:00
#47229 #47229
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Danke für deine Antwort, ich habe es jetzt mit den
Argumenten -X -A probiert. Die Fehlermeldung heisst jetzt:

Can't locate object method "new" via package "Dev::MySQLDB" at test.pl line 31.

Ist ja irgendwie komisch, er scheint jetzt das Modul zu finden, aber die
Methode nicht?? Oder wie?
Das mit dem eigenen lib Verzeichnis hört sich gut an probier ich dann auch aus\n\n

<!--EDIT|Robse|1124377275-->
Strat
 2005-08-18 19:15
#47230 #47230
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
hast du meinen ersten rat auch befolgt? Was steht bei dir in @INC? in welchem Verzeichnis befindet sich das Modul? Wie genau lautet der Name der Datei, in der du das Package gespeichert hast?

2. heisst dein konstruktor wirklich new? oder heisst der vielleicht connect?\n\n

<!--EDIT|Strat|1124378317-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Robse
 2005-08-18 20:40
#47231 #47231
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Also nach make install liegt das Modul in

/usr/lib/perl5/site_perl/5.8.0/

im Verz. Dev (Obiges Vz. ist auch in @INC enthalten)
Die Datei heisst MySQLDB.pm.
Der Konstruktor heisst auch ganz sicher 'new'.

Ich habe jetzt noch mal einen einfachen test gemacht:

/home/test/mod/testmod.pm
Code: (dl )
1
2
3
4
5
6
package testmod;

sub new
{
#
}

/home/test/test.pl
Code: (dl )
1
2
3
use testmod;

my $obj = tetsmod->new();

Und die Pfade sind wie oben.

h2xs -X -A -n testmod
perl Makefile.PL
make
make install
../perl test.pl

und dann kommt wieder

Can't locate object method "new" via package "testmod" at test.pl line 3.

Also jetzt geht es gar nicht mehr.
Da muss doch noch was anderes falsch sein?
Robse
 2005-08-18 20:45
#47232 #47232
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Habe jetzt mal die Datei /usr/lib/perl5/site_perl/5.8.0/testmod.pm überprüft,
und siehe da, mein source code ist gar nicht mehr drin!
Jetzt steht da
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
package testmod;

use 5.008;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration use testmod ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(

);

our $VERSION = '0.01';


# Preloaded methods go here.

1;

etc..
Wie ist das denn passiert?
Das original Modul (mysqldb vom 1. Post) wurde jedenfalls nicht verändert.
pq
 2005-08-18 22:04
#47233 #47233
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
natürlich ist dein sourcecode nicht mehr drin. h2xs erstellt ein völlig neues
package-skelett. es kann dir aber nicht die arbeit abnehmen, code
reinzuschreiben - wie auch? woher soll perl wissen, wo dein code ist?
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
Robse
 2005-08-18 22:22
#47234 #47234
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Aha, so läuft der Hase.
Ich habe gedacht, durch den Parameter -n wird
eine make basierend auf dem existierendem .pm
File gemacht - das war wohl der Denkfehler.
ptk
 2005-08-18 23:02
#47235 #47235
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Warum steht denn da in einem File testmod und im anderen tetsmod?
Robse
 2005-08-19 14:29
#47236 #47236
User since
2005-01-08
22 Artikel
BenutzerIn
[default_avatar]
Copy & Paste - Fehler.
<< >> 10 Einträge, 1 Seite



View all threads created 2005-08-18 18:07.