我有一个有趣的情况.在一些(大)遗留代码中,有一个看起来像的命名空间require A::B,但是添加了A的路径,所以可以这么说require B.但是,我希望能够使用这两种调用.这是否可以在不创建重定向包的情况下实现?例如,有没有办法双重声明一个包?
谢谢!
Eri*_*rom 16
首先加载包:
require A::B;
Run Code Online (Sandbox Code Playgroud)
别名B为A::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
为了使透明工作,您可以将以下代码添加到每个文件:
A/B.pm
*B:: = *A::B::;
$INC{'B.pm'}++;
Run Code Online (Sandbox Code Playgroud)B.pm
*A::B:: = *B::;
$INC{'A/B.pm'}++;
Run Code Online (Sandbox Code Playgroud)然后,如果用户确实require A::B;,他们可以打电话A::B::foo或B::foo和require B;将成为一个无操作.
如果一个用户做require B;他们可以打电话A::B::foo或B::foo和require A::B;将成为一个无操作.
但是为了可维护性,最好将所有实际代码保存在一个文件中(以及上面的别名代码),并将另一个文件设置为仅加载真实文件的填充程序.假设A/B.pm包含真实代码:
A/B.pm
*B:: = *A::B::; # this gets added to the existing file
$INC{'B.pm'}++;
Run Code Online (Sandbox Code Playgroud)B.pm
require A::B; # this is the entire file
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |