Como usar сабу a partir de um script Perl

Tarefa. Há um script na linguagem de programação Perl. Nele é definida alguma função (saba). Precisa заиспользовать esse recurso em outro script.

Aqui está um exemplo. Há um script script.pl em que é definida saba header. Este сабу передаешь a linha, e ele retorna a string no formato markdown para o cabeçalho. Este script esta saba é utilizado para visualizar na tela duas cabeçalho:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

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

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

Lançamos perl script.pl e o que vemos na tela:

## ONE
## TWO

Tarefa — criar um script other.pl que também é a vontade de usar esse сабу.

A solução copy — paste

A mais simples (mas de má), a solução é só copiar o código sava em outro script. Com tal solução é obtida essa é a other.pl:

#!/usr/bin/perl

use feature qw(say);

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

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

say header('three');

Agora você pode executar este script perl other.pl e ver na tela o texto ## THREE.

Esta é a solução do problema, mas é uma má decisão. Devido ao fato de que o mesmo código que está em vários arquivos, torna-se difícil trabalhar com esse código. Quando precisar alterar este сабу, então terá de mudar-la em vários lugares (e ainda precisa não esquecer de trocar o código em todos os arquivos).

A solução de suportar сабу em um módulo separado

A decisão mais certa, é suportar сабу em um módulo separado. Para fazer isso, criamos o arquivo de 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; - anunciou o que é a "biblioteca" Utils
  • use strict; e use warnings; — incluímos um modo para Perl foi mais exigente quanto a um bom código
  • 5 linhas sobre EXPORT falam sobre o fato de que, quando conectado a esta "biblioteca" para a função de header estava disponível
  • passaram aqui a função de
  • 1; — package sempre deve terminar com a verdade

Depois disso, a descrição da função deve ser a partir de um script script.pl arrumar, mas adicionar uma ligação a biblioteca:

#!/usr/bin/perl

use feature qw(say);

use Utils;

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

Depois disso, você pode executar o script usando o comando perl -Ilib/ script.pl. A chave de linha de comando -I transferimos o valor lib/ — a pasta na qual o Perl será procurar a biblioteca. O resultado desse script é exatamente o mesmo como antes.

E agora é completamente trivial заиспользовать esse mesmo сабу em outro script. Escrevemos script other.pl, que é praticamente o mesmo como script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

Execute este script perl -Ilib/ other.pl e o que vemos na tela ## THREE.

A solução é montar o código do script em shell script

Não há outra solução como você pode usar сабу algum script script.pl заиспользовать no script other.pl. Para isso, escrevemos esse texto no arquivo other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

Execute o script perl other.pl (um arquivo other.pl deve estar na mesma pasta que o script script.pl). Resultado:

## ONE
## TWO
## THREE

Т. е. aconteceu que, quando a execução do script other.pl, o primeiro foi executado todo o código que foi em script.pl (linha ## ONE e ## TWO), e que só depois é feito o código de script other.pl (linha ## THREE).

Para quando você executa o script de other.pl não foi parte script.pl precisamos de um pouco alterar script.pl. Precisa de forrar todo o código no corpo do script sob condição e incorporar no fim do script a unidade como valor verdadeiro:

#!/usr/bin/perl

use feature qw(say);

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

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

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

1;

Agora, se conseguirmos perl script.pl, obtemos exatamente a mesma saída como antes, e se voltarmos a perl other.pl, então a saída será apenas o de nos texto ## THREE.

A palavra-chave caller retorna um valor diferente dependendo de como foi lançado o script. Este фичу que usamos aqui para dividir a execução do script diretamente a conexão de um script usando require.

Outros artigos