Module - Wie geht das
|
Seitenanfang |
| Hi ich bin Perl-Neuling und hab da noch so meine Probleme mit den Modulen. Also ich habe ein Skript geschrieben und möchte einige der Unterfunktionen auslagern. ? Kann es dabei zum Problem werden, wenn ich globale Variablen (also mit "our") benutze? Und wie kann ich dann in meinem Hauptprogramm auf die ausgelagerten Funktionen zugreifen? Hoffe mir kann einer von euch helfen. lg Franzi
Datum: 30.07.2008-14:32

|
re: Module - Wie geht das
|
Seitenanfang |
| Hallo! Ich denke dieses Tutorial ist recht hilfreich (auch die anderen Seiten): http://perl-seiten.homepage.t-online.de/html/perl_modul.html Die Variablendeklaration mit "our" ist dort auf der folgenden Seite beschrieben. Wenn dann noch Fragen offen sein sollten, einfach nochmal hier anklopfen ;) Grüße, Skrilax
Datum: 30.07.2008-15:04

|
re: Module - Wie geht das
|
Seitenanfang |
hi danke für die prompte antwort, leider hilft sie mir nicht viel da ich dieses tutorial schon gelesen habe und trotzdem irgendwie in einer sackgasse stecke.trotzdem nochmal danke lg franzi
Datum: 30.07.2008-15:06

|
Lösungsansatz
|
Seitenanfang |
so hab jetz so etwas ähnliches wie einen lösungsansatz ... nur was muss ich jetzt alles in meinem Programm / Modul ändern Hier mal eine (sehr) kurze sub die ich auslagern will: # print debug message if # debug feature is enabled sub debug { our %globals; if ($globals{"DEBUG"}) { print STDERR "DBG: @_\n"; } } Anmerkungen: der globale Hash "%globals" (ich weis - sehr einfallsreich *g*) ist(momentan noch) im Hauptprogramm deklariert, kann ich den dann überhaupt noch so verwenden?
Datum: 30.07.2008-15:42

|
re: Lösungsansatz Hilfe
|
Seitenanfang |
Eigendlich dachte ich jetzt hab ichs aba da stimmt scheinbar doch was net. *kopfkratz* Könnte da mal bitte jemand drüberlesen und mir sagen was falsch ist.Modul Schnipsel: package definitions; use strict; use Exporter; @ISA = qw(Exporter); @EXPORT = qw(%defaults %globals); our %globals; $globals{"lines"}; $globals{"hfile"}; $globals{"cfile"}; $globals{"pfile"}; .... Aufruf im Hauptporgramm: ... use strict; use definitions; ... und dann die fehlermeldung beim ausführen: Global symbol "@ISA" requires explicit package name at definitions.pm line 14. Global symbol "@EXPORT" requires explicit package name at definitions.pm line 15. Compilation failed in require at ./click2rtl_try line 43. BEGIN failed--compilation aborted at ./click2rtl_try line 43.
Datum: 30.07.2008-17:17

|
re: Lösungsansatz Hilfe
|
Seitenanfang |
Für @ISA und @EXPORT gilt genau das gleiche wie für alle Variablen unter strict:
our @ISA = qw(Exporter); our @Export = qw(...);
sollte das Problem lösen.
Datum: 30.07.2008-20:46

|
re Lösungsansatz Hilfe
|
Seitenanfang |
| Danke so funktionnierts jetzt - Mehr oder weniger. jetz hab ich ein neues problem das ich nich verstehe. Ich hab die ganzen Module in ein Verzeichnis verschoben und dieses an @INC angehängt >> push (@INC, "./Modules/"); Aber des versteht mei sktipt anscheinend nicht. << Can't locate definitions.pm in @INC (@INC contains: /opt/highway_4.3.1/lib/perl /opt/inway_4.3.1/lib/perl /opt/perl_5.6.1/lib /opt/perl_5.6.1/share/lib /opt/perl_5.6.1/lib /opt/perl_5.6.1/share/lib /opt/perl_5.6.1/share/lib .) at ./click2rtl_try line 47. BEGIN failed--compilation aborted at ./click2rtl_try line 47. (Das aktuelle Verzeichnis findet er dafür ?!?) Habs auch schon mit >> our @INC; versucht klappt aber auch nicht. Hab ich da irgendwo nen syntax fehler den ich net seh oder stimmt da was garnicht
Datum: 31.07.2008-08:49

|
re: re Lösungsansatz Hilfe
|
Seitenanfang |
Lass mich raten: Sieht dein Quellcode vlt. ungefähr so aus?
push(@INC, "./Modules"); use description;
Das kann so nicht funktionieren, dass liegt in der Art wie der Perl-Interpeter dein Skript verarbeitet: Es werden nämlich zuerst sämtliche "use"-Anweisungen und alle BEGIN-Blöcke abgearbeitet, erst danach der restliche Code. Das bedeutet, das "use description;" vor dem "push()" ausgeführt wird. Folgendes verschafft Abhilfe:
BEGIN { push(@INC, './Modules') } use description;
oder noch besser:
use lib './Modules' use description
Datum: 01.08.2008-14:51

|
re: re Lösungsansatz Hilfe
|
Seitenanfang |
| Danke jetzt gehts!!! *freu*
Datum: 04.08.2008-08:20

|
re: Lösungsansatz Hilfe
|
Seitenanfang |
ok? es geht doch nich ich werd noch wahnsinnig...also mein code sieht do aus: package click2rtl_cmdline; #---------------------------------------------# path to my includes use lib './'; use lib './Modules'; # includes use strict; use click2rtl_header; use File::Basename; use Exporter; # export the "main" funktion our @ISA = qw(Exporter); our @EXPORT = qw(get_cmdline_args); das is so der kopf jedes moduls (mit andern funktionen natürlich) allerdings mekert er mir an, dass er die globalen variablen, die ich in diesem modul verwende nicht findet (sie sind im click2rtl_header modul deklariert) was mach ich denn nun schon wieder falsch
Datum: 13.08.2008-10:34

|
re: Lösungsansatz Hilfe
|
Seitenanfang |
Wie sind die globalen Variablen deklariert? Wie rufst du sie dann vom anderen Package aus auf?Deklariert sollten sie immer per our werden. Aufrufen musst du sie dann trotzdem mit Angabe des package-Namens, wenn du sie nicht exportierst:
package Modul; our $global = 'hallo!'; package main; print $Modul::global, "\n";
Oder:
--------- Modul.pm --------- package Modul; use Exporter; our @EXPORT = qw( $global ); our $global = 'hallo!'; --------- Skript.pl -------- use lib '/path/to/Dir/of/Modul'; use Modul; print $global, "\n"; ----------------------------
Mit our deklarierte Variablen sind auch nicht völlig global. Btw: was steht eigentlich so alles im "click2rtl_header" drin? Den Vorspann eines Modules nochmals auszulagern halte ich selten für sinnvoll... Grüße, Skrilax
Datum: 13.08.2008-11:59

|
re: Lösungsansatz Hilfe
|
Seitenanfang |
Danke hab mein fehler grad eben gefunden ... klar dass da was durcheinander kommt wenn ich net aufpass wohin ich meine module speicher und dann alles doppelt und dreifach hab ... ;)sollt nächstes mal erst gucken wo welche datei is und obs die wo anders nochmal gibt bevor ich ander leute mit meinen problemen nerve ... aber trotzdem danke für deine hilfe lg franzi
Datum: 13.08.2008-12:02

|