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

Package ruft Funktion aus anderem Package auf?

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
BratHering
 2005-11-27 16:12
#60432 #60432
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Hallo!

Wieder einmal habe ich eine Frage:
Meine Application besteht aus Zwei Packages und dem Main natürlich.

Main;
MyCollection::MyApp::Functions;
MyCollection::MyApp::OtherFunctions;

Wie man sieht habe ich mehrfach verschachtelte Packages. Diese sind auch auf dem Dateisystem in den jeweiligen Verzeichnissen drin. Also d.h. im root Verzeichnis des Projektes sind die Main und das Verzeichnis MyCollection und in diesem ist das Verzeichnis MyApp und in diesem sind die *.pm Dateien drin.

Frage: Gibt es eine möglichkeit in MyCollection::MyApp::Functions; eine funktion aus MyCollection::MyApp::OtherFunctions; aufzurufen? - Wenn ja, ich komm nicht drauf wie... :(


MfG
BratHering\n\n

<!--EDIT|BratHering|1133101182-->
esskar
 2005-11-27 17:21
#60433 #60433
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
klar
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
package MyCollection::MyApp::Functions;

use strict:
use warnings;
use MyCollection::MyApp::OtherFunctions;

sub call_a_function {
&MyCollection::MyApp::OtherFunctions::call_an_other_function(@_);
}

1;
Relais
 2005-11-27 17:24
#60434 #60434
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=BratHering,27.11.2005, 15:12]Frage: Gibt es eine möglichkeit in MyCollection::MyApp::Functions; eine funktion aus MyCollection::MyApp::OtherFunctions; aufzurufen? - Wenn ja, ich komm nicht drauf wie... :([/quote]
Da gibt es viele Möglichkeiten. Ich nenne mal die zwei, die ich aus guten Gründen bevorzuge...

MyCollection::MyApp::OtherFunctions::aufzurufenddesub

und, angenommen innerhalb von

package MyCollection::MyApp::Functions

stünde

use base qw(MyCollection::MyApp::OtherFunctions);

und Du verwendetest ein Objekt aus der Klasse "MyCollection::MyApp::Functions", dann

$self->aufzurufenddesub;\n\n

<!--EDIT|Relais|1133105168-->
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
BratHering
 2005-11-27 17:47
#60435 #60435
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
@ esskar:
Rein intuitiv habe ich es bereits so probiert wie Du es in Deinem Beispiel gezeigt hast, allerdings wird use MyCollection::MyApp::OtherFunctions; beim Aufruf in package MyCollection::MyApp::Functions; nicht gefunden. Stattdessen muss ich den use; Aufruf in OtherFunctions; abändern und dann klappt es. Aber genau das verwirrt mich und daher wollte ich nochmals nachfragen.

Also so gehts nicht bei mir:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
package MyCollection::MyApp::Functions;

use strict:
use warnings;
use MyCollection::MyApp::OtherFunctions;

sub call_a_function {
 &MyCollection::MyApp::OtherFunctions::call_an_other_function(@_);
}

1;


Aber so gehts:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
package MyCollection::MyApp::Functions;

use strict:
use warnings;
use OtherFunctions;

sub call_a_function {
 &MyCollection::MyApp::OtherFunctions::call_an_other_function(@_);
}

1;


Die beiden *.pm Dateien liegen im Verzeichnis MyCollection\MyApp\*.pm drin.


@ Relais:
Sorry aber Deine Beispiele verstehe ich nicht. :(


Und ich bin nachwievor verwirrt... :/
J-jayz-Z
 2005-11-27 18:12
#60436 #60436
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich denke mal, dein verständnissproblem liegt bei use base.
Mit use base qw/package/; erbst du von package und lädst es auch gleichzeitig mit require.
Deshalb, da du ja erbst, kannst du auch über das ganz normale Objekt, das zu deinem package gehört auf alle subs in package zugreifen.

for details: perldoc base
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
BratHering
 2005-11-27 18:36
#60437 #60437
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
hmm... ok, nur verwirrt mich das wiedrum, weil ich hier keine klassen oder oop betreibe, noch nicht.

Ich hätte lieber eine Antwort auf das vom esskar geantwortete.
esskar
 2005-11-27 19:20
#60438 #60438
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
seltsam...
wenn dein script in /root liegt und deine Module unterhalb von /root/MyCollection/MyApp/ sollte es eigentlich funktionieren
J-jayz-Z
 2005-11-27 19:48
#60439 #60439
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
eben, weil . in @INC steht. Versteh ich auch nicht so ganz ...
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
BratHering
 2005-11-27 20:25
#60440 #60440
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,27.11.2005, 19:20]seltsam...
wenn dein script in /root liegt und deine Module unterhalb von /root/MyCollection/MyApp/ sollte es eigentlich funktionieren[/quote]
Nein, sorry ich habe mich falsch ausgedrückt; mit root meinte ich so als ob den root des projektes. ;)

Also das gesamte Projekt befindet sich in einem Verzeichnis irgendwo auf der HD, aber nicht im root Verzeichnis. In diesem Projekt Verzeichnis sind die Main.pl und das Verzeichnis MyCollection vorhanden. Und in dem Verzeichnis MyCollection ist das Verzeichnis MyApp vorhanden. Und in dem Verzeichnis MyApp sind die *.pm Dateien (sowie Functions.pm als auch OtherFunctions.pm) vorhanden.

Code: (dl )
1
2
3
4
..\workspace\Projekt\*
..\workspace\Projekt\Main.pl
..\workspace\Projekt\MyCollection\MyApp\Functions.pm
..\workspace\Projekt\MyCollection\MyApp\OtherFunctions.pm


BTW: Ich nutze Windows mit Eclipse um mit Perl zu programmieren.
:)
GwenDragon
 2005-11-27 20:40
#60441 #60441
User since
2005-01-17
14758 Artikel
Admin1
[Homepage]
user image
Code: (dl )
use lib "../workspace/Projekt";

oder

Code: (dl )
1
2
3
4
# als Beispiel zeigt /MySpace/MyModules/ 
# auf ein festes Modulverzeichnis, in das benötigte Module
# gespeichert werden sollten
use "/MySpace/MyModules";

So mache ich es bei Projekten

oder

Code: (dl )
1
2
use FindBin;
use lib "$FindBin::Bin/../workspace/Projekt";
\n\n

<!--EDIT|GwenDragon|1133117637-->
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



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