1

首先,我想说这不是设计问题,而是合规问题。我知道当前设置存在问题。

在一个模块中,有一些以服务器命名的包,这些包具有许多与该服务器相关的相同变量/函数。看起来这是这样设置的,以便您可以执行以下操作:

  • PRODUCTION_SERVER_NAME::printer()或者
    TEST_SERVER_NAME::printer()

也许更好的设计可能是这样的:

  • CENTRAL_PACKAGE_NAME::printer('production')或者CENTRAL_PACKAGE_NAME::printer('test')

无论如何,似乎服务器名称已更改,因此我不想使用实际的服务器名称,而是将包重命名为PRODUCTIONTEST,而不更改仍然引用的其他代码PRODUCTION_SERVER_NAME

就像是:

package PRODUCTION, PRODUCTION_SERVER_NAME;  # pseudo code

我猜某种 glob/import 可能会起作用,但想知道是否已经有一些类似的东西。我也意识到饱和命名空间并不是一个好习惯。

4

3 回答 3

3

我不会就设计或可能涉及更改客户端代码的任何内容提供任何评论。MyTest.pm可以使用MyTest::或访问函数MyExam::。但是,您不能使用use MyExam,因为物理文件不存在。你可以做一些聪明的@INC把戏,但是当我试图变得聪明时,我的程序总是崩溃和烧毁。

我的测试.pm

package MyTest;

sub hello { 'Hello' }
sub twoplustwo { 4 }

for my $sub (qw( hello twoplustwo)) {
    no strict 'refs';
    *{"MyExam::$sub"} = *{"MyTest::$sub"};
}

1;

测试.pl

#!/usr/bin/env perl

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

use MyTest;

say MyExam::hello();
say MyExam::twoplustwo();

输出:

你好
4
于 2012-06-27T15:42:37.273 回答
2

你考虑过使用aliased吗?听起来它可以为你工作。

于 2012-06-27T15:34:49.067 回答
0

尝试Exporter::Auto

package Foo;

use Exporter::Auto;

sub foo {
    print('foo');
}

package Bar;

use Foo;

package main;

Foo::foo();
Bar::foo();
于 2012-06-27T16:30:59.153 回答