Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种Perl模块或技术使使用长名称空间变得更容易?_Perl_Namespaces - Fatal编程技术网

是否有一种Perl模块或技术使使用长名称空间变得更容易?

是否有一种Perl模块或技术使使用长名称空间变得更容易?,perl,namespaces,Perl,Namespaces,有些名称空间很长,令人讨厌。假设我下载了一个名为foooo-BarBar-BazBaz.tar.gz的假设包,它包含以下模块: FooFoo::BarBar::BazBaz::Bill FooFoo::BarBar::BazBaz::Bob FooFoo::BarBar::BazBaz::Ben FooFoo::BarBar::BazBaz::Bozo FooFoo::BarBar::BazBaz::Brown FooFoo::BarBar::BazBaz::Berkly FooFoo::Bar

有些名称空间很长,令人讨厌。假设我下载了一个名为foooo-BarBar-BazBaz.tar.gz的假设包,它包含以下模块:

FooFoo::BarBar::BazBaz::Bill
FooFoo::BarBar::BazBaz::Bob
FooFoo::BarBar::BazBaz::Ben
FooFoo::BarBar::BazBaz::Bozo
FooFoo::BarBar::BazBaz::Brown
FooFoo::BarBar::BazBaz::Berkly
FooFoo::BarBar::BazBaz::Berkly::First
FooFoo::BarBar::BazBaz::Berkly::Second

是否有一个模块或技术可以使用类似于C++的“语句”,即,有一种方法可以做到< /P>

using FooFoo::BarBar::BazBaz;
那就让我做吧

my $obj = Brown->new();

ok $obj->isa('FooFoo::BarBar::BazBaz::Brown') ;  # true
# or...
ok $obj->isa('Brown'); # also true
pragma是这样做的:

use aliased 'FooFoo::BarBar::BazBaz::Bill';

my $bill = Bill->new;
别名

use constant Bill => 'FooFoo::BarBar::BazBaz::Bill';
# or 
sub Bill () {'FooFoo::BarBar::BazBaz::Bill'}
这样做的缺点是,包名作为参数的正常使用是通过带引号的字符串完成的:

$obj->isa('FooFoo::BarBar::BazBaz::Bill')
但是常量子程序需要是一个简单的字:

$obj->isa(Bill);
这就像是一个等待发生的错误

或者,您可以只使用Perl对命名空间别名的内置支持:

package Foo::Bar::Baz::Bill;

sub new {bless {}}

package Foo::Bar::Baz::Tom;

sub new {bless {}}

package main;

BEGIN {*FBB:: = *Foo::Bar::Baz::}  # the magic happens here

say FBB::Bill->new;  # Foo::Bar::Baz::Bill=HASH(0x80fd10)

say FBB::Tom->new;   # Foo::Bar::Baz::Tom=HASH(0xfd1080)
关于
->isa('shortname')
要求,别名隐藏方法通常使用带引号的字符串:

my $obj = FBB::Bill->new;

say $obj->isa('FBB::Bill');           # prints 1
say $obj->isa('Foo::Bar::Baz::Bill'); # prints 1

编译时别名
BEGIN{*short:=*long::package::name::}
的效果在所有包和作用域中都是全局的。只要您选择一个空包作为别名,就可以了

如果模块只需要调用类方法,那么子类化是最简单的解决方案。当然,这可以在运行时动态完成,以选择账单的去向

push @Bill::ISA, "FooFoo::BarBar::BazBaz::Bill";
print Bill->isa("FooFoo::BarBar::BazBaz::Bill");
1

sub FooFoo::BarBar::BazBaz::Bill::yo {
  print "FooFoo::BarBar::BazBaz::Bill here\n";
}

Bill->yo
FooFoo::BarBar::BazBaz::Bill here

你能举一个名字太长的例子吗,以及如何在代码中使用它,使其长度变得烦人?大多数代码通常不需要显式地使用显式包或类名,除非在极少数地方使用。@Ether-有一种设计思想,您几乎不应该从模块的名称空间导出/导入内容。其基本原理是,通过查看代码,几乎不可能找出某个特定标识符是从哪个模块导出的,如果使用了大量模块,这对于信息的可读性是很有价值的。当然,这种设计考虑只适用于类级的东西(不是对象方法)——在面向对象和静态标识符较少的模块中,你的点(大多数地方不需要完整的模块名)是非常真实的。即使在C++中,也有<代码>使用名称空间STD < /代码>,而STD只有3个字符!所以“太长”确实是主观的这里我最关心的是使用对象的时候。对象永远不会导出子例程,但与其关联的命名空间可能很长。类似MyCompany::MyApp::Object::Instance之类的东西可能不会太糟糕,除非您必须制作一打,每个都来自不同的名称空间!“对象永远不会导出子例程”?这是什么意思?至于长名称,与格符号可以使代码更具可读性。所谓“对象永远不会导出子例程”,我的意思是“这些包只包含只能使用方法调用的子例程。这些子例程不会导出,在使用函数语法调用时也没有任何意义。”目前我假设已经选择了名称空间,所以其他命名约定在这里没有帮助。(我很好奇你所说的与格符号是什么意思;你有例子吗?)。谢谢你给我指明了正确的方向。它看起来也有
namespace::alias
,但目前看起来还不太成熟。
namespace::alias
是一个有趣的想法,因为它的影响是词汇范围的。然而,到目前为止,由于它与perl的C实现的深度耦合,它只能在perl版本和平台的一小部分上工作。有趣的注意:如果您使用像
new{my$class=shift;return bloss{},$class}
这样的构造函数,那么
$class
将被设置为别名。但是,在对象被祝福之后,
ref$class
返回无别名的名称空间!