加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:26:45 所属栏目:大数据 来源:网络整理
导读:如果我有一个非常长的包名,我可以通过在符号表中创建一个条目来对该包进行别名: BEGIN { # Make "Alias" be an alias for "Some::Really::Long::Package"; *Alias:: = *Some::Really::Long::Package::; # Equivalent to: # *main::Alias:: = *Some::Reall
如果我有一个非常长的包名,我可以通过在符号表中创建一个条目来对该包进行别名:

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()的尝试都会失败

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这样的模块会修改你的主包,因为似乎没有办法避免它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读