perl 是否有一个模块/杂注来合并或分组多个'use'语句?[副本]

14ifxucb  于 2023-05-01  发布在  Perl
关注(0)|答案(1)|浏览(156)

此问题已在此处有答案

How to "use" multiple modules with one "use"?(3个答案)
How can I export a list of modules with my own module?(1个答案)
3天前关闭。
例如,如果有以下模块,我想导入:

  • My::Plugin::FeatureA
  • My::Plugin::FeatureB
  • My::Plugin::AnotherFeature

我这样做:

use My::Plugin::FeatureA;
use My::Plugin::FeatureB;
use My::Plugin::AnotherFeature;

是否有一个模块来合并这些语句?即给定一个前缀和名称列表,其样式类似于:

use IMPORTER qw<My::Plugin FeatureA FeatureB AnotherFeature>;

这个例子没有说明导出的非默认符号,但是我很好奇是否存在这样的东西,或者是否应该创建这样的东西。
Plack::Builder具有用于中间件/插件的构建器子例程,这是我所追求的风格。但是,我们的想法是将其用作pragma。

wvt8vs2t

wvt8vs2t1#

我把问题问'* 我如何合并导入语句 *',它说它如何试图编写一个模块来实现他们所示的所需导入语句,但他们如何遇到微妙的问题。(他们一定是说错了,所以这看起来像是一个软件推荐的问题,他们准备编辑这个问题,纠正这个印象。)
无论如何,问题中所示的期望的导入/pragma语句让我觉得是不可能的--首先,如何适应导入列表,当然这些列表在这些模块中可能会有所不同?一旦我们开始了,那么pragma呢?等等
编写一个组装导入语句的模块实际上确实很棘手,因为不能只是堆积这些导入语句。但他们已经做到了--参见Import::Into
来自概要

package My::MultiExporter;

use Import::Into;

sub import {
  my $target = caller;
  Thing1->import::into($target);
  Thing2->import::into($target, qw(import arguments));
}

# etc -- there's way, way more

然后你在你的程序中use My ::MultiExporter;
这里有一个草图,也许更重要的是,组装模块

package LoadModules;

use warnings;
use strict;
use feature 'say';

use Import::Into;

# Initializing this hash to all supported keys also serves as documentation
my %arg = map { $_ => '' } qw(base utils extras file all); #etc

sub import
{
    my ($pack, @args) = @_;

    %arg = map { $_ => 1 } @args;

    my $target = caller;

    warnings ->import::into($target);
    strict   ->import::into($target);
    feature  ->import::into($target, ':5.10');

    if ($arg{base}) {
        Getopt::Long ->import::into($target);
        Const::Fast  ->import::into($target);
        Data::Dump   ->import::into($target, qw(dd pp));
    }
    
    if ($arg{utils}) {
        List::Util      ->import::into($target, qw(min max));
        List::MoreUtils ->import::into($target, qw(any all none uniq));
    }

    # ... etc ...
}

1;

然后,我们会加载想要的bundle,比如use LoadModules qw(base utils);等。
为了更进一步,让subs加载bundle,这样就可以在不重复代码的情况下组合选项

sub import {
   ...

   _load_base($target)  if $arg{base};
   _load_utils($target) if $arg{utils};

   if ($arg{all}) { 
      _load_base($target);
      _load_utils($target);
      ...
   }
}

sub _load_base {
    my ($target) = @_;
    Getopt::Long ->import::into($target);
    Const::Fast  ->import::into($target);
    Data::Dump   ->import::into($target, qw(dd pp));
}
...

当然还有其他的方法来组织论点;或者仅仅通过经由调度表加载它们来使它们的处理自动化。
这种方法在程序中缺少导入符号的列表,但这是一个一直存在的难题,即如何最好地简化导入语句,同时又对导入进行文档化。
上面的代码是一个草图,需要工作,但希望它是有用的。

相关问题