首先,我想说这不是设计问题,而是合规问题。我知道当前设置存在问题。
在模块中,有一些以服务器命名的包,它们具有许多与该服务器相关的变量/功能。它看起来像这样设置,你可以这样做:
PRODUCTION_SERVER_NAME::printer()
或TEST_SERVER_NAME::printer()
也许更好的设计可能是这样的:
CENTRAL_PACKAGE_NAME::printer('production')
或CENTRAL_PACKAGE_NAME::printer('test')
无论如何,似乎服务器名称已更改,因此我不想使用实际的服务器名称,而是将包重命名为PRODUCTION
或TEST
,而不更改其他代码。仍然引用PRODUCTION_SERVER_NAME
。
类似的东西:
package PRODUCTION, PRODUCTION_SERVER_NAME; # pseudo code
我猜某些glob / import可能会起作用,但是想知道是否已经有类似的东西。我也意识到使命名空间饱和不是一种好习惯。
答案 0 :(得分:3)
我不对设计或任何可能涉及更改客户端代码的内容提供任何意见。可以使用MyTest.pm
或MyTest::
访问MyExam::
中的功能。但是,您无法使用use MyExam
,因为物理文件不存在。你可以做一些聪明的@INC
技巧,但是当我试图变得聪明时,我的程序总会崩溃和燃烧。
package MyTest;
sub hello { 'Hello' }
sub twoplustwo { 4 }
for my $sub (qw( hello twoplustwo)) {
no strict 'refs';
*{"MyExam::$sub"} = *{"MyTest::$sub"};
}
1;
#!/usr/bin/env perl
use strict; use warnings;
use feature 'say';
use MyTest;
say MyExam::hello();
say MyExam::twoplustwo();
输出:
Hello 4
答案 1 :(得分:2)
您是否考虑过使用aliased
?听起来它可能适合你。
答案 2 :(得分:0)
package Foo;
use Exporter::Auto;
sub foo {
print('foo');
}
package Bar;
use Foo;
package main;
Foo::foo();
Bar::foo();