Schrift
[thread]6931[/thread]

funktionen aus eigenem Modul einbinden

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
supersucker
 2005-04-26 18:43
#54230 #54230
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Hi zusammen,

hab ein problem was wahrscheinlich supereinfach zu lösen ist, aber ich komm grad nicht weiter, folgendes:

ich hab einige perl-scripte die im gleichen verzeichnis liegen und alle dem package FRAG_LIB angehören, da die scripte einige funktionen gemeinsam nutzen, wollte ich diese in ein separates modul auslagern, was ich also getan hab ist folgendes:

- ich hab im gleichen verzeichnis in dem die scripte liegen ein modul namens "functionsAndConstants.pm" erstellt

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use warnings;
use DBI;
use Math::Trig qw(tan sec csc cot asin acos atan asec acsc acot sinh cosh tanh sech csch coth asinh acosh atanh asech acsch acoth);
use Math::MatrixReal;

package FRAG_LIB;

sub RadToDegree()
{
return (($_[0] * 180)/ Math::Trig->pi());
}


- und hab dass dann so in eines meiner scripte eingebunden:

Code: (dl )
use functionsAndConstants;


daraufhin hab ich von eclipse (ich entwickle unter fedora 3, eclipse 3 und epic) die fehlermeldung erhalten:

"line x did not return a true value" (mit x als der zeile in der die use declaration steht)

dann hab ich es noch so probiert:
Code: (dl )
use "functionsAndConstants.pm";


egal wie ich es probiert hab, alles ergab entweder obige fehlermeldung oder die meldung das ich in der zeile in der ich das modul einbinde einen syntaxfehler habe....

alle anderen Module die ich eingebunden habe (wie z.B. Math::MatrixReal s.o.) funktionieren einwandfrei....

und wenn ich sowas mache wie:

Code: (dl )
1
2
3
4
foreach (@INC)
{
print "$_ \n";
}

sehe ich auch, dass @INC auch das aktuelle verzeichnis, in dem sich alle scripte und das modul befinden, enthält

was läuft denn da falsch?
die einbindung des moduls?
oder hab ich bei dem modul selber was nicht beachtet?

hab jetzt schon in einigen tutorials gekuckt, aber das modul scheint so korrekt zu sein....

auf selfhtml steht dazu folgendes beispiel:

Code: (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl -w

sub Modulprint {
print "Hier meldet sich das Modul \"Modul.pm\"\n";
}

1;


hab auch schon mal "1;" im modul eingefügt, das hat aber auch nichts gebracht (bedeutung von "1;"?)

thx für jede hilfe.........
sesth
 2005-04-26 18:49
#54231 #54231
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Auf die "1;" würde ich aber tippen. Ein Modul muss als letzten Wert immer True zurückliefern um zu dokumentieren, dass es fehlerfrei geladen wurde. Die 1 am Ende liefert True als letztes ausführbares Statement des Moduls.
Gruß
Thomas
pKai
 2005-04-26 18:50
#54232 #54232
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=supersucker,26.April.2005, 16:43]"line x did not return a true value"

hab auch schon mal "1;" im modul eingefügt, das hat aber auch nichts gebracht (bedeutung von "1;"?)[/quote]
1 == true
Rückgabe wert des Moduls beim use.
Sollte das letzte sein, was in der Modul-Datei steht.
I sense a soul in search of answers.
sesth
 2005-04-26 18:53
#54233 #54233
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Versuche es mal mit
Code: (dl )
use FRAG_LIB;

und benenne Dein Modul in FRAG_LIB.pm um.
Gruß
Thomas
pKai
 2005-04-26 19:06
#54234 #54234
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
OT:
Was spricht eigentlich dagegen die sub rad2deg von Math::Trig zu verwenden?
Code: (dl )
1
2
3
4
>perl -MMath::Trig
print rad2deg(pi())
^Z
180
I sense a soul in search of answers.
frodus
 2005-04-27 01:45
#54235 #54235
User since
2003-09-26
147 Artikel
BenutzerIn
[default_avatar]
Hi,

um Funktionen die in einem Modul definiert sind in einem
anderen zu benutzen. Musst du die Funktionen exportieren.

In etwa so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use warnings;
use DBI;
use Math::Trig qw(tan sec csc cot asin acos atan asec acsc acot sinh cosh tanh sech csch coth asinh acosh atanh asech acsch acoth);
use Math::MatrixReal;

package FRAG_LIB;

use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(RadToDegree);
our @EXPORT_OK = qw();

sub RadToDegree()
{
return (($_[0] * 180)/ Math::Trig->pi());
}


Den Code habe ich nicht getested aber so sollte es funktionieren.

Note:
Den Exporter braucht man nur fuer ein nicht OO Interface von einem
modul.

Das Beispiel von SelfHtml setzt vorraus das du es nicht mit use sondern
mit do einbindest.

Gruss,

Frodus

P.S: Versuch mal 'perldoc Exporter'
pKai
 2005-04-27 03:33
#54236 #54236
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=frodus,26.April.2005, 23:45]um Funktionen die in einem Modul definiert sind in einem
anderen zu benutzen. Musst du die Funktionen exportieren.[/quote]
Nö, er kann sie immer unter Angabe des betreffenden Namensraumes, also hier als
FRAG_LIB::RadToDegree()
aufrufen, auch ohne Exporter.
Exportieren muss man nur, wenn man die Namen beim Aufrufer importieren will, um dann eben die Funktion ohne "Herkunfts-"Namensraum einfach als RadToDegree() aufrufen zu können.

Dass das Modul einen "true" Rückgabewert haben muss, ist allerdings ein Muss.

Außerdem: sub RadToDegree()
definiert per Prototyp eine Funktion ohne Argumente.
Wenn sie mit Argumentliste aufgerufen wird -- was wohl zu erwarten ist, da ja im Inneren $_[0] angesprochen wird -- wird es einen Kompilezeitfehler geben.\n\n

<!--EDIT|pKai|1114558545-->
I sense a soul in search of answers.
sri
 2005-04-27 04:01
#54237 #54237
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oder du schnappst sie dir einfach!
Code: (dl )
*RadToDegree = \&FRAG_LIB::RadToDegree;
frodus
 2005-04-27 11:43
#54238 #54238
User since
2003-09-26
147 Artikel
BenutzerIn
[default_avatar]
O.K. 'musst' ist übertrieben und ich vergass dass wir über perl
reden, da gibt es ja immer mehr als einen Weg. ;)

Ich bevorzuge halt den Exporter.

/Frodus
supersucker
 2005-04-27 18:26
#54239 #54239
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
danke für die zahlreichen antworten, jetzt bin ich allerdings etwas verwirrt.......:-)

@sesth:

Quote
Versuche es mal mit
Code: (dl )
use FRAG_LIB;

und benenne Dein Modul in FRAG_LIB.pm um.


klappt nicht, da meldet mir eclipse einen syntaxfehler

@pKai :

Quote

Was spricht eigentlich dagegen die sub rad2deg von Math::Trig zu verwenden?


nichts, nur ist die funktion so klein, dass es schneller ging die selber zu schreiben, als das modul einzubinden.....:-)
diese funktion an sich ist nicht wirklich notwendig, aber ich hab noch viele andere selbstgeschriebene funktionen die ich gerne auslagern würde.....

Was ich jetzt gemacht hab, ist folgendes:
hab mein Modul jetzt STUFF.pm genannt (ich weiss, sehr aussagekräftig..)

und dass dann mit:

Code: (dl )
use STUFF.pm


in den scripts eingebunden, dass ist soweit auch ok (und die "1;" hab ich auch hinzugefügt)

hab jetzt versucht, die methode in den scripts folgendermaßen aufzurufen:

Code: (dl )
1
2
my$tralala = STUFF::RadToDegree($halali)
my$tralala = STUFF->RadToDegree($halali)


mach ich das mit dem arrow-operator krieg ich immer das gleiche ergebnis, nämlich null, ich hab von obiektorientierter programmierung unter perl keine ahnung, aber ich vermute mal dass ich mit dem arrow-operator eine objektmethode aufrufe, was natürlich nicht hinhauen kann, da ich ja auch keine klasse habe

mache ich es mit "::" kriege ich die fehlermeldung das ich die methode mit zu vielen argumenten, dass wird der fehler sein, den pkai unten schon erwähnt hat...

meine frage nun:

wie muss ich denn die methode RadToDegree im modul ändern, damit das klappt? Hab bisher in perl alle parameterübergaben mit
Code: (dl )
shift @_;

gemacht....
müsste dann die radtodegree - funktion im modul etwa so
Code: (dl )
1
2
3
4
sub RadToDegree($argument)
{
return (($argument * 180)/ Math::Trig->pi());
}

aussehen? (kann ich grad nicht testen, weil ich auf arbeit bin, und nix dabei hab)

danke!!
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2005-04-26 18:43.