2014-12-10 2 views
1

Я имею в виду, используя следующие перл модули из CPAN:избежать столкновений с модулями с одинаковыми именами методов

CSS-Minifier
Javascript-Minifier

Я отмечаю из документации, что мне нужно вызвать «Минимизировать» метод для обоих.
Я знаю, что я должен упустить что-то очевидное как новичок в Perl, но разве они не столкнутся?

Я полагаю, что вопрос заключается в том, как задать «minify» для каждого модуля отдельно, чтобы CSS-модуль работал только с CSS и JS-модуль работал только на JS?

ответ

5

модули Perl включает в себя подпрограмму. Обычно причиной использования модуля является использование подпрограмм из этого модуля. Модуль будет иметь свое собственное имя пакета, и подпрограммы из этого модуля будут существовать в этом пакете. Таким образом, простой модуль может выглядеть следующим образом:

package MyModule; 

sub my_sub { 
    print "This is my sub\n"; 
} 

Если я загрузить этот модуль в моем коде, то я должен вызвать подпрограмму, используя его полное имя (т.е. включая имя пакета).

use MyModule; 

MyModule::my_sub(); 

Это получает повторяющиеся довольно быстро, так что многие модули будут экспорт их подпрограммами в ваш пакет. Они делают это с использованием специальных массивов, называемых @EXPORT и @EXPORT_OK.

Если я поместил имя подпрограммы в @EXPORT, то он автоматически импортируется всякий раз, когда используется этот модуль.

package MyModule; 

our @EXPORT = ('my_sub'); 

sub my_sub { 
    print "This is my sub\n"; 
} 

можно затем использовать его как это:

use MyModule; 

my_sub(); 

В качестве альтернативы, можно использовать @EXPORT_OK, который определяет необязательный экспорт. Пользователи могут запрашивать подпрограммы в @EXPORT_OK для импорта - но это происходит не автоматически. Вы запрашиваете экспорт опций для импорта, включая имя в заявлении use.

package MyModule; 

our @EXPORT_OK = ('my_sub'); 

sub my_sub { 
    print "This is my sub\n"; 
} 

теперь я могу это сделать:

use MyModule ('my_sub'); 

my_sub(); 

Там еще один трюк, который может быть полезным. Вы можете отключить автоматический импорт с пустым списком в операторе use. Предположим, что мы имеем версию @EXPORT модуля:

use MyModule(); # Turn off imports 

my_sub(); # Doesn't work 
MyModule::my_sub(); # works 

Теперь у нас есть знания, мы должны смотреть на вашей конкретной проблемы. Самое простое решение - отключить все автоматические импорт и использовать полностью квалифицированные имена обеих подпрограмм.

use CSS::Minifier(); 
use JavaScript::Minifier(); 

CSS::Minifier::minify(); 
JavaScript::Minifier::minify(); 

Но мы можем быть немного умнее. Документация для обоих модулей предполагает, что оба импорта являются необязательными, поэтому вам нужно явно импортировать подпрограммы.

use CSS::Minifier ('minify'); 
use JavaScript::Minifier('minify'); 

Это, очевидно, было бы плохо, потому что вы не можете импортировать две подпрограммы с тем же именем!

Однако, глядя на исходный код к модулям, я вижу, что документация для JavaScript :: Minifier неправильно (Edit: Я submitted a report об этой ошибке). CSS :: Minifier имеет следующую строку кода:

Но JavaScript :: Minifier имеет это:

our @EXPORT = qw(minify); 

Так экспорт автоматически из JavaScript :: Minifier и опциональный из CSS :: Minifier. Таким образом, самый простой подход взять бы:

use JavaScript::Minifier; # Automatically imports minify 
use CSS::Minifier; # Doesn't import option export minify 

Вы могли бы использовать две подпрограммы, как это:

minify(); # Automatic export from JavaScript::Minifier 
CSS::Minifier::minify(); # Fully-qualified name from CSS::Minifier 

Подозреваю, однако, что это плохой подход, как это трудно быть уверенным, откуда берется безоговорочная версия minify(). Поэтому я рекомендую отключить весь импорт из двух модулей и использовать полностью квалифицированные имена для обеих подпрограмм.

+0

Спасибо за четкий и подробный ответ. Принимая это вместо этого. – Dayo

2

Назвать это отдельно, если оба exported, использование:

CSS::Minifier::minify(); 

или

JavaScript::Minifier::minify(); 
+1

Пожалуйста, объясните, почему downvote –

+0

Это был не я, но я предполагаю, что это потому, что вы можете вызывать подпрограммы с полностью квалифицированными именами ли они или нет на экспорт. –

+0

Не был и я. Подтвердите свой ответ, но принимайте это от Дэйва Креста за ясность и детали. Благодаря! – Dayo

1

Вы можете использовать полные имена для ссылок на подпрограммы и устранить неоднозначность. И создайте более короткие имена с псевдонимами.

use CSS::Minifier; 
use JavaScript::Minifier; 

BEGIN { 
    *minify_css = \&{CSS::Minifier::minify}; 
    *minify_js = \&{JavaScript::Minifier::minify}; 
} 

minify_css(...); 
minify_js(...); 
+0

Спасибо. Полезный совет по псевдонимам! – Dayo

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