2016-03-06 1 views
1

Это, вероятно, было задано раньше, но я не уверен, что искать. Проблема в том, что я имею дело с пакетом, который имеет 4 каталога глубиной и имеет довольно длинное имя. Внутри пакета есть некоторые экспортированные константы, которые я хочу использовать в основном, но я не хочу использовать их полностью квалифицированные имена и не хочу использовать их локальное имя (часть после последнего: :). Например.Работа с глубокими именами пакетов в perl и их экспортированными константами и подпрограммами

use strict; 
use warnings; 
use Vendor::FirstPackage::SecondPackage::ThirdPackage qw(const_a); 

# this is works, but I want to include the last package 
my $x = const_a; 

# this throws bareword error 
my $y = ThirdPackage::const_a; 

# this throws undefined subroutine 
my $z = ThirdPackage::const_a(); 

Есть ли способ получить доступ к константе через последнее имя пакета?

ответ

7
use Package::Alias 'ThirdPackage' => 'Vendor::FirstPackage::SecondPackage::ThirdPackage'; 

Но я бы рекомендовал просто использовать полное имя.

+0

Помимо стиля, существует ли функциональная причина использования FQN вместо псевдонима? – gogators

+1

@gogators: псевдоним по существу создает глобальную переменную% ThirdPackage ::. это плохо для всех обычных причин, по которым глобальные переменные являются плохими. например что происходит, когда есть также Vendor2 :: Foo :: Bar :: ThirdPackage, что вы также хотите использовать псевдоним? – ysth

+1

Я на самом деле думаю, что ответ Барта намного лучше. – ysth

1

Вы можете использовать Module::Load так:

use strict; 
use warnings; 
use Module::Load qw(load_remote); 
BEGIN { 
    load_remote 'ThirdPackage', 'Vendor::FirstPackage::SecondPackage::ThirdPackage', qw(const_a); 
} 

my $x = ThirdPackage::const_a; 
3

Вы можете создать пакет, как это в основном скрипте:

package ThirdPackage; 
use strict; 
use Vendor::FirstPackage::SecondPackage::ThirdPackage qw(const_a); 

Тогда вы должны быть в состоянии получить доступ const_a в ThirdPackage::const_a. Если вы поставите этот пакет в начале основного сценария, то основной код должен быть отделен с package main;

Смежные вопросы