perl – 如何在不影响主包的情况下对长包名称进行别名?
如果我有一个非常长的包名,我可以通过在符号表中创建一个条目来对该包进行别名:
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 "myMethodn"; } 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-local”别名
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 这两个例子都应该按预期工作.因此,任何从包main调用Alias-> myMethod()的尝试都会失败
因为符号表%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 } 编辑(作为对编辑问题的回复): 更新的问题是:
我不这么认为. 有几种方法可以使用 – >语法,但不与::.这是因为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().
现在,我上面描述的内容也解释了为什么像Package :: Alias这样的模块会修改你的主包,因为似乎没有办法避免它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |