我可以在Perl包中压缩导出例程吗



我当前的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;  

如果使用常量而不是变量,

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.

您可以使用源过滤器添加一些自定义预处理。

示例:

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+exports+(S+)(.*)$/push @EXPORT, '$2'; $1 $2 $3/;
}
$status;
}
1;

用法:

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

请注意,此实现可能存在缺陷。基本上s/^(.*)s+exports+(S+)(.*)$/push @EXPORT, '$2'; $1 $2 $3/;regexp会像一样转换行

our export $SUCCESS = 0;

进入

push @EXPORT, '$SUCCESS'; our $SUCCESS = 0;

最新更新