1

まず、これは設計の問題ではなく、コンプライアンスの問題です。現在の設定に問題があることは承知しています。

モジュールには、サーバーにちなんで名付けられたパッケージがあり、そのサーバーに関連する多くの同じ変数/関数があります。これは、次のことができるように設定されているようです。

  • PRODUCTION_SERVER_NAME::printer()また
    TEST_SERVER_NAME::printer()

おそらく、より良い設計は次のようなものだったかもしれません:

  • CENTRAL_PACKAGE_NAME::printer('production')またCENTRAL_PACKAGE_NAME::printer('test')

とにかく、サーバー名が変更されたようです。そのため、実際のサーバー名を使用する代わりに、まだ参照している他のコードを変更せずに、パッケージの名前を単にPRODUCTIONまたはに変更したいと思います。TESTPRODUCTION_SERVER_NAME

何かのようなもの:

package PRODUCTION, PRODUCTION_SERVER_NAME;  # pseudo code

ある種のグロブ/インポートが機能する可能性があると推測していますが、同様のことを行うものが既にあるかどうか疑問に思っていました。また、名前空間を飽和させるのは良い習慣ではないことも認識しています。

4

3 に答える 3

3

デザインや、クライアント コードの変更に関連する可能性のあるものについてはコメントしません。の関数には、またはMyTest.pmを使用してアクセスできます。ただし、物理ファイルが存在しないため使用できません。巧妙なトリックを行うこともできますが、賢くしようとすると、私のプログラムは常にクラッシュして燃えます。MyTest::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();

出力:

こんにちは
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 に答える