2010-08-03 5 views
5

Ich habe ein Perl-Skript (Standalone-Programm), das einige Subs enthält, die ich in anderen Skripts wiederverwenden möchte. Aufgrund von Einschränkungen der Ausführungsumgebung kann ich die Funktionen nicht in eine gemeinsame .pm Datei verschieben.Perl-Skript als Programm und als Modul verwendbar

Ist es möglich zu unterscheiden, ob das Skript als eigenständiges Programm ausgeführt wurde oder ob es von einem anderen Skript editiert wurde require ed/do?

Das einzige, was ich finden konnte, war caller auf der obersten Ebene zu verwenden: Standalone-Programm hat keinen Anrufer, während wenn require ed caller zeigt, wer das Modul geladen hat. Gibt es eine bessere Lösung?

+0

Ich habe die Antwort unten veröffentlicht, aber wenn Sie die "Einschränkungen der Ausführungsumgebung" näher erläutern könnten, gibt es möglicherweise Möglichkeiten, diese Einschränkungen zu umgehen, die Ihnen die Verwendung geeigneter Module ermöglichen würden? Thx – DVK

+0

@DVK: Ich bin wirklich glücklich mit Ihrer Antwort. (Weder meine Syntax von Caller() ist so schön wie in Ihrer Antwort.) Bezüglich der Begrenzung. Wirklich ziemlich albern: Ich kann dem Verzeichnis kein weiteres nicht ausführbares Modul hinzufügen, da es nach den Dateien durchsucht wird und alle Dateinamen eine besondere Bedeutung haben. Durch Hinzufügen von .pm gibt es andere Skripte, die ich nicht ändern darf. – Dummy00001

+1

Laut @FM, meine Frage ist im Wesentlichen eine dup von http://StackOverflow.com/Questions/1131304/ – Dummy00001

Antwort

9

Ja, Ihr caller Ansatz war richtig - das ist eine Technik namens "Modulinos" von brian d foy. Ich vermute, dass Brian es erfunden hat, wenn mich jemand nicht im Gegenteil aufklärt.

Der Hauptarbeitsteil von modulino sieht wie folgt aus (von SO unten verlinkt) Antwort:

__PACKAGE__->run(@ARGV) unless caller; 
sub run { 
    my($class, @args) = @_; 
} 
1; 

hier ein paar Referenzen sind:

"Modules as Programs" chapter from "Mastering Perl" book by brian d foy

"Scripts as Modules" article in Dr. Dobbs

"How a script becomes a module" article on perlmonks

What should I put in my starter template for my Perl programs?

+1

+1 eine verwandte Frage: http://StackOverflow.com/Questions/1215657. – FMc

+1

Tom Christiansen (glaube ich) prägte den Begriff Progmod für diese viele Jahre vor "Modulino" – ysth

+1

Ich erfand die Technik nicht. Tom C. war die erste Person, die ich gesehen habe. Ich habe es nur populär gemacht. –

Verwandte Themen