Perl:为变量/函数设置多个包名?

时间:2012-06-27 15:26:25

标签: perl namespaces package

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

在模块中,有一些以服务器命名的包,它们具有许多与该服务器相关的变量/功能。它看起来像这样设置,你可以这样做:

  • 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可能会起作用,但是想知道是否已经有类似的东西。我也意识到使命名空间饱和不是一种好习惯。

3 个答案:

答案 0 :(得分:3)

我不对设计或任何可能涉及更改客户端代码的内容提供任何意见。可以使用MyTest.pmMyTest::访问MyExam::中的功能。但是,您无法使用use MyExam,因为物理文件不存在。你可以做一些聪明的@INC技巧,但是当我试图变得聪明时,我的程序总会崩溃和燃烧。

MyTest.pm

package MyTest;

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

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

1;

test.pl

#!/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)

尝试Exporter::Auto

package Foo;

use Exporter::Auto;

sub foo {
    print('foo');
}

package Bar;

use Foo;

package main;

Foo::foo();
Bar::foo();