2012-04-11 6 views
3

Ich habe ein Hauptprogramm mytool.pl von der Kommandozeile ausgeführt werden. Es gibt mehrere Hilfsscripte special1.pl, special2.pl usw., die jeweils ein paar Subroutinen und einen Hash enthalten, die in allen Skripten identisch benannt sind. Nehmen wir an, diese heißen MySpecialFunction(), AnotherSpecialFunction() und% SpecialData.Mit einem Perl-Skript verwenden Sie eines unter mehreren sekundären Skripts

Ich möchte, dass mytool den Inhalt einer der speziellen * .pl-Dateien enthält/verwendet/importiert, nur einen gemäß einer Befehlszeilenoption. Zum Beispiel wird der Benutzer tun:

bash> perl mytool.pl --specialcase=5 

und MyTools wird MySpecialFunction() von special5.pl verwenden, und ignorieren alle anderen Sonder * .pl-Dateien.

Ist das möglich und wie geht das?

Es ist wichtig zu beachten, dass die Auswahl der zu verwendenden speziellen Datei zur Laufzeit erfolgt. Daher ist das Hinzufügen einer "Verwendung" am oberen Rand von mytool.pl wahrscheinlich nicht das Richtige.

Hinweis Ich bin ein langjähriger C-Programmierer, kein Perl-Experte; Ich frage vielleicht etwas Offensichtliches. Dies ist für ein einmaliges Projekt, das in nur einem Monat zu Staub werden wird. Weder mytool.pl noch special? .pl (noch perl selbst) werden über das Ende dieses kurzen Projekts hinaus interessant sein. Daher interessieren uns keine Lösungen, die aufwändig sind oder eine tiefe Magie erlernen müssen. Schnell und schmutzig bevorzugt. Ich vermute, dass Perls Modul-Mechanismus dafür übertrieben ist, aber keine Ahnung, was die Alternativen sind.

Antwort

1

Wenn Sie use ein Modul, Perl nur require ist das Modul in einem BEGIN Block (und importiert die Module exportierten Artikel). Da Sie das zur Laufzeit geladene Skript ändern möchten, rufen Sie require selbst an.

if ($special_case_1) { 
    require 'special1.pl'; 
    # and go about your business 
} 

Hier ist ein good reference auf, wenn use vs. require zu verwenden.

+0

Die Schlüsselidee besteht darin, das Schlüsselwort 'require' zu verwenden. Ich habe einen Cheatsheet zu 'Verwendung' 'require' 'do' und 'import' gefunden (drei davon sind neu für mich) unter http://www.snowfrog.net/2009/05/09/perl-use-require-import -und-ich/was beantwortet mehrere unscharfe Fragen, die ich in meinem Kopf hatte. – DarenW

+0

@DarenW Sehen Sie sich die Perl-Dokumentation an, die in Perl integriert ist. Sie verwenden das 'perldoc'-Programm, um die Dokumentation zu lesen. Es ist alles auf dem [Web] (http://perldoc.perl.org) auch. Sehen Sie sich den Tutorial-Abschnitt an. –

2

Sie können einen Hash oder ein Array verwenden, um Werte von specialcase zu .pl Dateien und require oder do sie wie erforderlich zuzuordnen.

#!/usr/bin/env perl 

use strict; use warnings; 

my @handlers = qw(one.pl two.pl); 

my ($case) = @ARGV; 
$case = 0 unless defined $case; 

# check that $case is within range 

do $handlers[$case]; 

print special_function(), "\n"; 
+0

Die Kombination in eine Datei wäre für uns kontraproduktiv. Die "speziellen" Dateien enthalten eine Menge eigenartigen festverdrahteten Müll, den wir lieber nicht ansehen würden. – DarenW

+0

In diesem Fall "tun" Sie die entsprechende Datei zur Laufzeit. Der Link zur Dokumentation befindet sich im ersten Abschnitt meiner Antwort. –