Прагма с псевдонимом делает это:
use aliased 'FooFoo::BarBar::BazBaz::Bill';
my $bill = Bill->new;
aliased
является синтаксическим сахаром для
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')
, метод с псевдонимом stash работает со строками в кавычках, как обычно:
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::}
является глобальным для всех пакетов и областей. Это нормально, если вы выбираете пустой пакет для псевдонима.