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

Module-Path ermitteln

Leser: 1


<< >> 9 Einträge, 1 Seite
esskar
 2005-04-08 01:03
#53581 #53581
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Hi.
Gibt es ne Möglichkeit, den Pfad heraus zu finden, in dem ein Modul liegt?
also
Code: (dl )
1
2
3
4
5
6
7
package A;

sub new {
print MyPath;
}

1;


Code: (dl )
1
2
use A;
my $a = A->new;


sollte nun eine Dateipfad ausgeben!
esskar
 2005-04-08 01:21
#53582 #53582
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
oder anders;
ich hab ein Modul, das im Verzeichnis / liegt und foo.pm heißt.
dazu gibt es ein verzechnis /bar . in dieserm Verzeichnis liegen ebenfalls .pm Dateien. Jedes Modul hat ein 'our $Name = "xyz";' Diese Module will ich enumerieren, mit require einbinden und die Variable $Name auslesen. Wie mach ich das am geschicktesten?
Dubu
 2005-04-08 01:24
#53583 #53583
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Die Pfade zu den eingebundenen Paketen liegen in %INC:
Code: (dl )
1
2
3
4
5
6
7
package A;

sub new {
  print $INC{"A.pm"};
}

1;

Als Argument muss da ein (relativer) Dateiname stehen, also bei use A ein $INC{"A.pm"} und bei use A::B ein $INC{"A/B.pm"}.

Das geht aber auch gleich im Hauptprogramm:
Code: (dl )
1
2
use A;
print $INC{"A.pm"};
esskar
 2005-04-08 02:38
#53584 #53584
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay; danke dubu; das ist schonmal ganz gut
weiter gehts:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $pck =;
my $pckpath = $pck; $pckpath =~ s!::!/!g;

sub callback {
my ($filename) = @_;

my $name = "";
my $basename = Ox::File::basename($filename);

require "$pckpath/Type/$basename";
}


basename macht das selbe wie 'File::Basename::basename';

jetzt versuch ich auf $Name in diesem package zuzugreifen

Code: (dl )
1
2
eval '$name = $'."$pck::Type::$basename::Name";
die $@;


das 'die' spuckt aus: syntax error at (eval 21) line 2, at EOF
wie mach ich es richtig?
esskar
 2005-04-08 02:41
#53585 #53585
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
immer nach dem post kommt mir die erleuchtung

Code: (dl )
1
2
3
4
5
6
my $name = "";
my $basename = Ox::File::basename($filename, ".pm");

require "$pckpath/Type/$basename.pm";
eval '$name = $'.$pck.'::Type::'.$basename.'::Name';
die "[$name]";


:)
ptk
 2005-04-08 12:29
#53586 #53586
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
_ _ FILE _ _ gibt den aktuellen Dateinamen (des Skripts, des Moduls) aus.
pq
 2005-04-08 13:22
#53587 #53587
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=esskar,08.04.2005, 00:41]
Code: (dl )
1
2
3
4
5
6
my $name = "";
my $basename = Ox::File::basename($filename, ".pm");

require "$pckpath/Type/$basename.pm";
eval '$name = $'.$pck.'::Type::'.$basename.'::Name';
die "[$name]";


:)[/quote]
iih, wieso denn eval, wenns auch mit symrefs geht:
my $name;
{ no strict 'refs';
 $name = ${ $pck.'::Type::'.$basename.'::Name' };
}
\n\n

<!--EDIT|pq|1112952174-->
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
 2005-04-08 13:40
#53588 #53588
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=pq,08.04.2005, 11:22]iih, wieso denn eval, wenns auch mit symrefs geht:[/quote]
danke;
mit solchen sachen kämpf ich immer!
Crian
 2005-04-08 13:51
#53589 #53589
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Dubu,07.04.2005, 23:24]Die Pfade zu den eingebundenen Paketen liegen in %INC:
Code: (dl )
1
2
3
4
5
6
7
package A;

sub new {
print $INC{"A.pm"};
}

1;

Als Argument muss da ein (relativer) Dateiname stehen, also bei use A ein $INC{"A.pm"} und bei use A::B ein $INC{"A/B.pm"}.

Das geht aber auch gleich im Hauptprogramm:
Code: (dl )
1
2
use A;
print $INC{"A.pm"};
[/quote]
Oh nein, und ich durchsuch immer @INC dafür *vordiestirnschlag*

Ich hoffe ich merks mir....
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
<< >> 9 Einträge, 1 Seite



View all threads created 2005-04-08 01:03.