别名包以启用双用途命名空间

Sap*_*Sun 3 perl namespaces

我有一个有趣的情况.在一些(大)遗留代码中,有一个看起来像的命名空间require A::B,但是添加了A的路径,所以可以这么说require B.但是,我希望能够使用这两种调用.这是否可以在不创建重定向包的情况下实现?例如,有没有办法双重声明一个包?

谢谢!

Eri*_*rom 16

首先加载包:

require A::B;
Run Code Online (Sandbox Code Playgroud)

别名BA::B:

*B:: = *A::B::;
Run Code Online (Sandbox Code Playgroud)

然后告诉require它已经加载了B

$INC{'B.pm'}++;
Run Code Online (Sandbox Code Playgroud)

为了确保一切正常,最好在BEGIN块内执行这些操作:

BEGIN {
    require A::B;
    *B:: = *A::B::;
    $INC{'B.pm'}++;
}
Run Code Online (Sandbox Code Playgroud)

在此之后,所有require A::B;require B;行将成为无操作.您还可以使用任一名称引用该包中的变量. \&A::B::foo == \&B::foo

为了使透明工作,您可以将以下代码添加到每个文件:

然后,如果用户确实require A::B;,他们可以打电话A::B::fooB::foorequire B;将成为一个无操作.

如果一个用户做require B;他们可以打电话A::B::fooB::foorequire A::B;将成为一个无操作.

但是为了可维护性,最好将所有实际代码保存在一个文件中(以及上面的别名代码),并将另一个文件设置为仅加载真实文件的填充程序.假设A/B.pm包含真实代码: