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在内部为你做的那样.然而,这很糟糕,因为它与主包装混乱.如何使别名仅影响当前包,并且只能使用包中的别名?我尝试将别名定义更改为
*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 workAlias->myMethod();package main;# I want this to not workAlias->myMethod();
如果Alias-> myMethod()和Alias :: myMethod()都在Short包中工作,而不是在main中,则可以获得奖励积分.
解决方法 由于您不想修改main的符号表,因此可以使用创建“package-local”别名package Short;use constant Alias => 'Some::Really::Long::Package'; # create aliasAlias->myMethod(); # correctly calls myMethod() of package Some::Really::Long::Package
或者
package Short;sub Alias { Some::Really::Long::Package:: } # create aliasAlias->myMethod(); # correctly calls myMethod() of package Some::Really::Long::Package
这两个例子都应该按预期工作.因此,任何从包main调用Alias-> myMethod()的尝试都会失败
Can’t locate object method “myMethod” via package “Alias” (perhaps you forgot to load “Alias”?)
因为符号表%main ::或%::没有名为Alias ::的条目.
由于您在一个文件中有多个包调用,您还可以创建$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()
andAlias::myMethod()
work in theShort
package but not inmain
?
我不这么认为.
有几种方法可以使用 – >语法,但不与::.这是因为perl似乎假设像Alias这样的裸字后跟包分隔符::表示包main中的包Alias:
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 ::添加到main的情况下使用Alias :: myMethod().
This is what something like
Package::Alias
does for you internally. However,this stinks because it mucks with themain
package.
现在,我上面描述的内容也解释了为什么像Package :: Alias这样的模块会修改你的主包,因为似乎没有办法避免它.
总结以上是内存溢出为你收集整理的perl – 如何在不影响主包的情况下对长包名称进行别名?全部内容,希望文章能够帮你解决perl – 如何在不影响主包的情况下对长包名称进行别名?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)