Schrift
[thread]7499[/thread]

Package ruft Funktion aus anderem Package auf? (Seite 2)

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
J-jayz-Z
 2005-11-27 21:00
#60442 #60442
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wobei es so eigentlich gehen sollte...
. ist in @INC. Dabei ist dann . das verzeichniss der Main.pl in ..\workspace\Projekt\. Unterhalb von . werden, wenn du Module einbindest die :: in \ ersetzt und das .pm weg. Also sollte es eigentlich gehen mit use MyCollection::MyApp::OtherFunctions; ...
Tut es nicht ?!
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2005-11-27 23:46
#60443 #60443
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=J-jayz-Z,27.11.2005, 20:00]Tut es nicht ?![/quote]
anscheinend ja nicht... oder wieso gibt es den thread? :)
J-jayz-Z
 2005-11-28 01:05
#60444 #60444
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
gute Frage:)
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Dubu
 2005-11-28 01:12
#60445 #60445
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Okay, ich habe das mit dem "." mal ausprobiert, mit und ohne use lib und ganz ohne FindBin (was man vernuenftigerweise sonst immer benutzen sollte).

Ich habe hier ein Skript useModules.pl mit folgendem Inhalt:
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
use warnings;
BEGIN { print "Vorher:\n"; print "»$_«\n" for @INC; }
use lib '.';
BEGIN { print "Nachher:\n"; print "»$_«\n" for @INC; }
use Foo::Bar;

Foo::Bar::output();


Das Modul Foo::Bar liegt in ./Foo/Bar.pm, also ein Verzeichnis unterhalt von useModules.pl. Es benutzt keinen Exporter o.ae., aber den brauche ich ja auch nicht, wenn ich die Funktion qualifiziert aufrufe. So sieht's aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
package Foo::Bar;

use strict;
use warnings;
use Foo::Bar::Baz;

sub output {
   print "Hello, this is " . _ _PACKAGE_ _ . "!\n";
   Foo::Bar::Baz::output2();
}

42;


Das in Foo::Bar benutzte Modul Foo::Bar::Baz wiederum liegt in ./Foo/Bar/Baz.pm und sieht fast identisch aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
package Foo::Bar::Baz;

use strict;
use warnings;

sub output2 {
   print "Hello, this is " . _ _PACKAGE_ _ . "!\n";
}

42;


Wenn ich nun das Programm useModules.pl ausfuehre, kommt folgendes heraus:
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
$ ./useModules.pl
Vorher:
»/etc/perl«
»/usr/local/lib/perl/5.8.7«
»/usr/local/share/perl/5.8.7«
»/usr/lib/perl5«
»/usr/share/perl5«
»/usr/lib/perl/5.8«
»/usr/share/perl/5.8«
»/usr/local/lib/site_perl«
»/usr/local/lib/perl/5.8.4«
».«
Nachher:
».«
»/etc/perl«
»/usr/local/lib/perl/5.8.7«
»/usr/local/share/perl/5.8.7«
»/usr/lib/perl5«
»/usr/share/perl5«
»/usr/lib/perl/5.8«
»/usr/share/perl/5.8«
»/usr/local/lib/site_perl«
»/usr/local/lib/perl/5.8.4«
Hello, this is Foo::Bar!
Hello, this is Foo::Bar::Baz!

Funktioniert also. Foo::Bar wird gefunden, und von dort aus Foo::Bar::Baz auch.

Von der Ausgabe her koennte man denken, dass das use lib '.' nur das aktuelle Verzeichnis von ganz hinten in @INC nach ganz vorne nimmt. Ohne use lib '.' sollte es also eigentlich keinen Unterschied machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
use warnings;
BEGIN { print "Vorher:\n"; print "»$_«\n" for @INC; }
# use lib '.';
BEGIN { print "Nachher:\n"; print "»$_«\n" for @INC; }
use Foo::Bar;

Foo::Bar::output();


Aber Pustekuchen!
Die Ausgabe sieht jetzt so aus:
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
$ ./useModules.pl
Vorher:
»/etc/perl«
»/usr/local/lib/perl/5.8.7«
»/usr/local/share/perl/5.8.7«
»/usr/lib/perl5«
»/usr/share/perl5«
»/usr/lib/perl/5.8«
»/usr/share/perl/5.8«
»/usr/local/lib/site_perl«
»/usr/local/lib/perl/5.8.4«
».«
Nachher:
»/etc/perl«
»/usr/local/lib/perl/5.8.7«
»/usr/local/share/perl/5.8.7«
»/usr/lib/perl5«
»/usr/share/perl5«
»/usr/lib/perl/5.8«
»/usr/share/perl/5.8«
»/usr/local/lib/site_perl«
»/usr/local/lib/perl/5.8.4«
».«
Undefined subroutine &Foo::Bar::output called at ./useModules.pl line 9.

Man beachte: Die Fehlermeldung kommt nicht vom use Foo::Bar! Das Modul wird also gefunden, aber die Funktion output() darin nicht.

Ich gebe zu, dass ich dieses Verhalten nicht verstehe.

Edit: Das Forum hat zweimal _ _PACKAGE_ _ geschluckt. Bitte (wie ueblich) die Leerzeichen wegdenken / nach paste korrigieren.\n\n

<!--EDIT|Dubu|1133184386-->
BratHering
 2005-11-28 01:26
#60446 #60446
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
[quote=Dubu,28.11.2005, 01:12]Man beachte: Die Fehlermeldung kommt nicht vom use Foo::Bar! Das Modul wird also gefunden, aber die Funktion output() darin nicht.

Ich gebe zu, dass ich dieses Verhalten nicht verstehe.[/quote]
Ja, genau das war mein Problem. Aber es hat sich inzwischen erledigt,denn Perls Motto ist ja: "There is always more than one way to do something, right?" ;)
pq
 2005-11-28 01:43
#60447 #60447
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
@dubu: kannst du das mal mit einer anderen perl-version prüfen? bei mir tritt der
fehler nicht auf (5.8.6 und 5.8.3)
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
Dubu
 2005-11-28 18:12
#60448 #60448
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Nachdem die gleiche Perlversion auf einem anderen System den Fehler nicht zeigte, kam es mir noch merkwuerdiger vor.

Ein (naheliegender?) Verdacht hat sich dann bewahrheitet:
Code: (dl )
1
2
$ locate Foo/Bar
/usr/local/lib/site_perl/Foo/Bar.pm

Ich hatte auf dem betroffenen System also schon mal ein Testmodul mit Namen Foo::Bar installiert. Und das wird in der zweiten Variante natuerlich vor dem in "." gefunden.

Das kommt davon, wenn man immer die gleichen bloeden, nerdigen Namen fuer alles nimmt ... *lol*

Danke fuer's Testen, pq.
pq
 2005-11-28 18:32
#60449 #60449
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Dubu,28.11.2005, 17:12]Ein (naheliegender?) Verdacht hat sich dann bewahrheitet:
Code: (dl )
1
2
$ locate Foo/Bar
/usr/local/lib/site_perl/Foo/Bar.pm

Ich hatte auf dem betroffenen System also schon mal ein Testmodul mit Namen Foo::Bar installiert.[/quote]
*g*
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
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-11-27 16:12.