Hvordan man bruger Saba fra et Perl-script

Opgave. Der er et script i programmeringssproget Perl. Det definerer en funktion (Saba). Du er nødt til at Taipalsaari denne funktion i et andet script.

Her er et eksempel. Der er et script script.pl , som definerer Saba header. Dette Saba pass strengen, og den returnerer denne streng i en markdown header. I dette script dette Saba bruges til at vise to overskrifter:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

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

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

Køre perl script.pl , se på skærmen:

## ONE
## TWO

Opgaven er at skabe et andet script other.pl , som også vil bruge Saba.

Løsningen — copy-paste

Den simple (men gode) løsning er at kopiere koden subs i et andet script. Denne løsning er opnået her er en other.pl:

#!/usr/bin/perl

use feature qw(say);

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

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

say header('three');

Du kan nu køre dette script perl other.pl og se, på skærmen teksten ## THREE.

Denne løsning på problemet, men det er en dårlig beslutning. På grund af det faktum, at den samme kode er i flere filer, bliver det svært at arbejde med en sådan kode. Når du har brug for at ændre dette Saba, så er nødt til at ændre det flere steder (og stadig er nødt til at huske at ændre kode i alle de rigtige filer).

Løsningen er at sætte Saba i et separat modul

Den korrekte løsning er at lave en Saba i et separat modul. For denne oprette en fil 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; - meddelt, at det "bibliotek" Utils
  • use strict; og use warnings; — switch-mode til Perl-var mere krævende i god kode
  • 5 linjer om EXPORT tyder på, at når du opretter forbindelse, at bibliotekerne er nødt til at fungere header var til rådighed
  • flyttet funktion
  • 1; — pakke, der skal ende med sandheden

Efter denne beskrivelse af den funktion, du har brug for fra script script.pl til at rydde op, men tilføjer forbindelse bibliotek:

#!/usr/bin/perl

use feature qw(say);

use Utils;

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

Du kan derefter køre den samme script ved hjælp af kommandoen perl -Ilib/ script.pl. I kommandolinjen -I pass værdi lib/ — mappe, hvor Perl, vil søg for bibliotekerne. Resultatet af dette script er præcis den samme som før.

Og nu helt trivielt at Taipalsaari samme Saba i et andet script. Skriv script other.pl, hvilket er næsten det samme som script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

Køre dette script perl -Ilib/ other.pl se på skærmen ## THREE.

Løsning — tilslut script-kode til script

Der er en anden løsning, som du kan bruge Saba er defineret i scriptet script.pl at Taipalsaari i scriptet other.pl. For at gøre dette, skal du skrive denne tekst til en fil other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

Kør script perl other.pl (file other.pl skal ligge i samme mappe som scriptet script.pl). Resultatet:

## ONE
## TWO
## THREE

Så når du kører scriptet other.pl for første gang blev alle af den kode, der var script.pl (linje ## ONE og ## TWO), og først derefter køre kode fra et script other.pl (linje ## THREE).

I orden, når du kører scriptet other.pl blev ikke udført en del script.pl vi har brug for en lille ændre script.pl. Du er nødt til at pakke det hele koden i scriptet organ under den betingelse at skrive i slutningen af scriptet enhed som en sand værdi:

#!/usr/bin/perl

use feature qw(say);

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

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

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

1;

Nu, hvis vi kører perl script.pl, vi får præcis den samme effekt som før, og hvis du starter perl other.pl, så produktionen vil være blot den ønskede tekst ## THREE.

Søgeord caller returnerer forskellige værdier afhængigt af, hvordan du i gang script. Denne funktion bruger vi her til at opdele en kører scriptet direkte forbindelsen script ved hjælp af require.

Andre artikler