Wie zu verwenden Sabu aus Perl-Skript

Aufgabe. Es ist ein Skript in der Programmiersprache Perl. In ihm definiert eine Funktion (Saba). Muss заиспользовать diese Funktion in einem anderen Skript.

Hier ist ein Beispiel. Es ist ein Skript script.pl in dem definiert Saba header. Dieses Sabu überträgst Zeile, und es gibt diese Zeile in Form von markdown-Header. In diesem Skript dieses Saba wird verwendet, um anzuzeigen zwei überschriften:

▶ Run
#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('one');
say header('two');

Starten Sie perl script.pl und sehen auf dem Bildschirm:

## ONE
## TWO

Aufgabe — erstellen Sie ein weiteres Skript other.pl wird auch die Verwendung dieses Sabu.

Lösung — copy-paste

Die einfachste (aber schlechte) Lösung ist einfach den Code kopieren Saba in ein anderes Skript. Mit dieser Lösung funktioniert hier ist ein other.pl:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('three');

Nun können Sie dieses Script perl other.pl und sehen auf dem Bildschirm angezeigten Text ## THREE.

Dies ist die Lösung des Problems, aber es ist eine schlechte Entscheidung. Aufgrund der Tatsache, dass der gleiche Code ist in mehreren Dateien wird es schwierig zu arbeiten mit solchen Codes. Wenn nötig ändern diese Sabu, müssen ändern Sie es in mehreren Orten (und müssen noch nicht vergessen zu tauschen der Code in den richtigen Dateien).

Lösung — ertragen Sabu in einem separaten Modul

Die richtige Entscheidung zu treffen, ist zu ertragen Sabu in einem separaten Modul. Dazu erstellen Sie eine Datei lib/Utils.pm:

package Utils;

use strict;
use warnings;

use Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
    header
);
our @EXPORT = @EXPORT_OK;

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

1;
  • package Utils; - angekündigt, dass diese "Bibliothek" Utils
  • use strict; und use warnings; — drehen Sie den Modus um Perl wurde immer anspruchsvoller zu einem guten Code
  • 5 Zeilen pro EXPORT besagen dass, wenn die Verbindung dieser "Bibliothek" muss um die Funktion header verfügbar war
  • hergebracht Funktion
  • 1; — package, sollte am Ende immer die Wahrheit

Nach dieser Beschreibung der Funktion aus dem Skript script.pl zu entfernen, aber das hinzufügen von verbindungen der Bibliothek:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('one');
say header('two');

Anschließend starten Sie dieses Skript mit dem Befehl perl -Ilib/ script.pl. In der Befehlszeile -I geben den Wert lib/ — Ordner in dem Perl wird suchen Sie nach der Bibliothek. Die Ergebnisse dieses Skript genau die gleiche wie zuvor.

Und jetzt ganz trivial заиспользовать die gleiche Sabu in einem anderen Skript. Schreiben das Skript other.pl, die praktisch die gleiche wie script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

Führen Sie dieses Skript perl -Ilib/ other.pl und sehen auf dem Bildschirm ## THREE.

Lösung — stecken Sie das Skript im Skript

Es gibt noch eine Lösung wie kann Sabu im Skript bestimmte script.pl заиспользовать im Skript other.pl. Dazu schreiben Sie den folgenden Text in die Datei other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

Führen Sie das Skript perl other.pl (Datei other.pl muss im gleichen Ordner wie das Skript script.pl). Ergebnis:

## ONE
## TWO
## THREE

D.h. was passiert beim ausführen des Skripts other.pl zunächst wurde der gesamte Code, der wurde in script.pl (Zeile ## ONE und ## TWO), und erst dann ist der Code aus dem Script other.pl (Zeile ## THREE).

Um beim Start des Skripts other.pl nicht ausgeführt wurde Teil script.pl wir brauchen ein wenig ändern script.pl. Brauchen Sie wickeln den gesamten Code in den Körper-Skript unter der Bedingung einzutragen und an das Ende des Skripts Einheit wie die wahre Bedeutung:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

if ( not caller() ) {
    say header('one');
    say header('two');
}

1;

Wenn wir laufen jetzt perl script.pl, so erhalten wir genau die gleiche Ausgabe wie zuvor, und wenn starten perl other.pl, das in der Ausgabe wird nur den gewünschten Text zu uns ## THREE.

Stichwort caller gibt die unterschiedliche Bedeutung, je nachdem wie gestartet wurde das Skript. Diese Funktion nutzen wir hier, um zu teilen, führen Sie das Skript direkt vom Anschluss des Skripts unter Verwendung require.

Andere Artikel