Могу ли я сжать мою процедуру экспорта в моем пакете Perl? - PullRequest
0 голосов
/ 22 ноября 2018

Мой текущий экспорт пакета Perl кажется длинным (фрагмент ниже).И да, лучше всего набирать все это только один раз в одном месте, чтобы мои многочисленные сценарии Perl могли получить доступ ко всему этому с помощью всего лишь:

use Funx;  

И все же я просто надеялся, что будет простой способ экспортировать все сменьше печатать.

package Funx;
#use strict;
use warnings;
use DBI;

use Exporter;
our @ISA    = 'Exporter';
our @EXPORT = qw(pdone dbstart dbstop dbc dbcdata numnums $SUCCESS $NOFILE 
$COPYFAIL $SOXFAIL $CURLFAIL $OPENFAIL $APPRUNNING $RAWDBEXIISTS $DBCREATEERR $DBCONNECTERR $TMPFILEERR $DBWRITEERR $INVALIDUSER $DBLOCKERR $DBUNLOCKERR WERR);

our $SUCCESS        =   0;
our $NOFILE         =   1;
our $COPYFAIL       =   2;
our $SOXFAIL        =   3;
our $CURLFAIL       =   4;
our $OPENFAIL       =   5;
our $APPRUNNING     =   6;
our $RAWDBEXIISTS   =   7;
our $DBCREATEERR    =   8;
our $DBCONNECTERR   =   9;
our $TMPFILEERR     =   10;
our $DBWRITEERR     =   11;
our $INVALIDUSER    =   12;
our $DBLOCKERR      =   13;
our $DBUNLOCKERR    =   14;
use constant WERR => 100;  

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы использовали константы вместо переменных,

package Funx;

use strict;
use warnings;

use constant qw( );
use Exporter qw( import );

BEGIN {
    my %error_codes = (
        FUNX_SUCCESS      =>   0,
        FUNX_NOFILE       =>   1,
        FUNX_COPYFAIL     =>   2,
        FUNX_SOXFAIL      =>   3,
        FUNX_CURLFAIL     =>   4,
        FUNX_OPENFAIL     =>   5,
        FUNX_APPRUNNING   =>   6,
        FUNX_RAWDBEXIISTS =>   7,
        FUNX_DBCREATEERR  =>   8,
        FUNX_DBCONNECTERR =>   9,
        FUNX_TMPFILEERR   =>  10,
        FUNX_DBWRITEERR   =>  11,
        FUNX_INVALIDUSER  =>  12,
        FUNX_DBLOCKERR    =>  13,
        FUNX_DBUNLOCKERR  =>  14,
        FUNX_WERR         => 100,
    );

    constant->import(\%error_codes);

    my @syms = keys(%error_codes);
    our @EXPORT_OK = \@syms;
    our %EXPORT_TAGS = ( ALL => \@syms, ERROR_CODES => \@syms );
}

В верхней части решения проблемы, которую вы подняли, вышеприведенное

  • Исправляет загрязнение пространства имен пользователя.По умолчанию не сбрасывайте кучу символов в другие пространства имен!
  • Исправляет плохие имена, которые могут конфликтовать с другими модулями.Вы думаете, что вы единственный модуль с кодом для SUCCESS?
  • Исправляет загрязнение @ISA вашего модуля.Funx не является подклассом Exporter.

Использование:

use Funx;                                 # Imports nothing.
use Funx qw( );                           # Imports nothing.
use Funx qw( :ERROR_CODES );              # Imports error codes.
use Funx qw( :ALL );                      # Imports error codes.
use Funx qw( FUNX_SUCCESS FUNX_NOFILE );  # Imports specific error codes.
0 голосов
/ 22 ноября 2018

Вы можете использовать фильтр источника , чтобы добавить пользовательскую предварительную обработку.

Пример:

package MyExport;

use Filter::Util::Call;

sub import {
    my ($type) = @_;
    my ($ref) = [];
    filter_add(bless $ref);
}

sub filter {
    my ($self) = @_;
    my ($status);

    if (($status = filter_read()) > 0) {
        s/^(.*)\s+export\s+(\S+)(.*)$/push \@EXPORT, '$2'; $1 $2 $3/;
    }

    $status;
}

1;

Использование:

...
use MyExport;
use Exporter;
our @ISA    = 'Exporter';
our @EXPORT;
...
our export $SUCCESS = 0;
...

Обратите внимание, чтоэта реализация может содержать ошибки.В основном s/^(.*)\s+export\s+(\S+)(.*)$/push \@EXPORT, '$2'; $1 $2 $3/; регулярное выражение превращает строки типа

our export $SUCCESS = 0;

в

push @EXPORT, '$SUCCESS'; our $SUCCESS = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...