gpt4 book ai didi

perl - 如何在不影响主包的情况下为长包名起别名?

转载 作者:行者123 更新时间:2023-12-04 18:30:02 25 4
gpt4 key购买 nike

如果我有一个非常长的包名,我可以通过在符号表中创建一个条目来为该包起别名:

BEGIN {
# Make "Alias" be an alias for "Some::Really::Long::Package";
*Alias:: = \*Some::Really::Long::Package::;
# Equivalent to:
# *main::Alias:: = \*Some::Really::Long::Package::;
}

这类似于 Package::Alias在内部为您服务。然而,这很臭,因为它与 main 混在一起。包裹。如何使别名仅影响当前包,并且只能在包中使用别名?我尝试将别名定义更改为
*Short::Alias:: = \*Some::Really::Long::Package::;

但是我必须使用 Short::Alias->myMethod()而不仅仅是 Alias->myMethod() .
use strict;
use warnings;

package Some::Really::Long::Package;

sub myMethod {
print "myMethod\n";
}

package Short;

BEGIN {
# Make "Alias" be an alias for "Some::Really::Long::Package";
*Short::Alias:: = \*Some::Really::Long::Package::;
}

# I want this to work
Alias->myMethod();

package main;

# I want this to not work
Alias->myMethod();

加分 如果两者都是 Alias->myMethod()Alias::myMethod()Short 工作包中,而不是在 main 中.

最佳答案

由于不想修改main的符号表,您可以创建一个“包本地”别名

package Short;

use constant Alias => 'Some::Really::Long::Package'; # create alias
Alias->myMethod(); # correctly calls myMethod() of package Some::Really::Long::Package

或者
package Short;

sub Alias { Some::Really::Long::Package:: } # create alias
Alias->myMethod(); # correctly calls myMethod() of package Some::Really::Long::Package

这两个示例都应按预期工作。因此,任何尝试调用 Alias->myMethod()来自包装 main显然会失败

Can't locate object method "myMethod" via package "Alias" (perhaps you forgot to load "Alias"?)



因为符号表 %main::%::没有名为 Alias:: 的此类条目.

由于您有多个 package在一个文件中调用,也可以创建 $alias引用 Some::Really::Long::Package .然后可以限制 $alias的范围到包 Short使其无法从其他地方访问:
package Short;
{
my $alias = Some::Really::Long::Package::; # create alias
$alias->myMethod(); # correctly calls myMethod() of package Some::Really::Long::Package
}

编辑(作为对已编辑问题的回应):

更新的问题是:

Can both Alias->myMethod() and Alias::myMethod() work in the Short package but not in main?



我不这么认为。

有几个选项可以使它与 -> 一起使用。语法,但不使用 :: .这是因为 perl 似乎假定像 Alias 这样的裸词后跟包分隔符 ::代表包 Alias包装内 main :
package Short;

Alias::myMethod(); # if you call myMethod(), you actually call it ...

::Alias::myMethod(); # ... like this, which is equivalent ...

main::Alias::myMethod(); # ... to this

所有三个看涨期权都是等价的,这证明了一个重要的事实。如果 perl 遇到类似 Foo:: ,它开始在包中查找 main首先而不是从当前(相对)位置。所以如果我在这里没有遗漏什么,你不能使用 Alias::myMethod()不添加 Alias::main .

This is what something like Package::Alias does for you internally. However, this stinks because it mucks with the main package.



现在,我上面描述的内容也可以解释为什么像 Package::Alias 这样的模块。修改您的 main包,因为似乎没有办法避免它。

关于perl - 如何在不影响主包的情况下为长包名起别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39988822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com