Frage

Ich habe einen Perl-Skript (foo.pl), die Foo.pm aus dem gleichen Verzeichnis lädt mit dem benötigen Mechanismus:

require "./Foo.pm";
...
my $foo = new Foo::Bar;

Die Foo.pm hält sich an das Standard-Modul Format:

package Foo::Bar;
...
1;

Anstatt die Verteilung meiner Anwendung als zwei Dateien (foo.pl und Foo.pm) Ich möchte nur eine Datei verteilen. Ich möchte Foo.pm Teil des foo.pl Skript machen Genauer gesagt.

Wie erreiche ich das?

Die triviale Ansatz einfach die Zusammenlegung der beiden Dateien (cat foo.pl Foo.pm> foo2.pl) funktioniert nicht.

War es hilfreich?

Lösung

Ihr Code nicht funktioniert hat (obwohl es hilfreich gewesen wäre, um die Fehlermeldung (n) an, dass Sie erhalten haben), weil Sie Foo :: Bar zu verwenden versucht, bevor sie definiert worden war. Versuchen Sie folgendes:

use strict;
use warnings;
my $foo = Foo::Bar->new();
# more code...

# end code

# begin definitions
BEGIN {
    package Foo::Bar;
    use strict;
    use warnings;
    # definitions...
    1;

    package Foo::Baz;
    # more stuff, if you need to define another class
}

Die Zugänge:

Andere Tipps

Wenn Sie in Einpacken Ihr Perl-Skript in ein binäres mit allen Modulen interessiert sind es auf einbezogen werden, hängt, können Sie PAR Packager :

pp -o binary_name foo.pl

Eine Datei kann mehrere Pakete enthalten. Legen Sie Ihre Klasse zuerst, gefolgt von der Haupt Skript:

package Foo::Bar;

sub new { 
  my $class = shift;
  return bless {}, $class;
}

#...

package main;

my $foo = Foo::Bar->new();
print ref $foo;  # Foo::Bar

Das Gesamtschema wäre Sie zu ersetzen „erfordern ...“ mit dem Inhalt, was Sie benötigen. Es gibt mehr zu ihm als die (BEGIN {} erforderlich sein kann), und ich bin mir nicht ganz sicher, was beteiligt ist. Sicherlich würden Sie es automatisieren.

Hier ist eine Alternative: eine einzelne ausführbare Datei erzeugen, wo Module Sie abhängen verpackt im Inneren mit PAR / pp

Sie haben bereits ein paar gute Antworten. Darüber hinaus ist es möglich, ein Modul zu machen, als direkt als Skript ausgeführt werden kann.

package Foo;

__PACKAGE__->run(@ARGV) unless caller();

sub run {
    # Do stuff here if you are running the Foo.pm as
    # a script rather than using it as a module.
}

Weitere Einzelheiten finden Sie brian d foy Wie ein Script ein Modul Becomes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top