perl – 如何在不影响主包的情况下对长包名称进行别名?

perl – 如何在不影响主包的情况下对长包名称进行别名?,第1张

概述如果我有一个非常长的包名,我可以通过在符号表中创建一个条目来对该包进行别名: BEGIN { # Make "Alias" be an alias for "Some::Really::Long::Package"; *Alias:: = \*Some::Really::Long::Package::; # Equivalent to: # *main::Alias 如果我有一个非常长的包名,我可以通过在符号表中创建一个条目来对该包进行别名:

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() and Alias::myMethod() work in the Short package but not in main?

我不这么认为.

有几种方法可以使用 – >语法,但不与::.这是因为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 the main package.

现在,我上面描述的内容也解释了为什么像Package :: Alias这样的模块会修改你的主包,因为似乎没有办法避免它.

总结

以上是内存溢出为你收集整理的perl – 如何在不影响主包的情况下对长包名称进行别名?全部内容,希望文章能够帮你解决perl – 如何在不影响主包的情况下对长包名称进行别名?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1255563.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存