2017-02-15 14 views
3

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

A.pl 
sub my_sub { 
    # do something 
} 

# do something else 
my_sub(); 
# do something else 

B.pl 
require A.pl; # but load only the subs, don't run anything 
my_sub(); 

Возможно ли это без того, чтобы выделить подлодку в отдельном файле .pm, а затем загрузить его?

+0

В некоторой степени связаны: [Возможно ли использовать скрипт Perl без выполнения его инструкций?] (Http://stackoverflow.com/q/232475) – ThisSuitIsBlackNot

+3

divide et impera .... – jm666

ответ

11

require будет запускать код. Поэтому вам нужно A.pl распознать разницу между загрузкой и вызовом в командной строке. Я думаю, что это можно сделать, но вы как бы не поняли смысла.

Вместо этого я настоятельно рекомендую обратить вспять все. Вместо того, чтобы иметь скрипты mammoth pl и модули pm, отмените его и получите крошечные файлы pl, единственной функцией которых является загрузка модулей (модулей) и вызов функции, которая инкапсулирует туда функциональность. И тогда тривиально добавлять новые модули для хранения общей формы или функциональности.

+0

Я полностью согласен. Но я наследую этот код откуда-то. Обычно я пишу код на Python (у которого есть отличный атрибут __main__, чтобы узнать, импортируется ли модуль или запускается автономно). Думал, что в perl тоже будет что-то подобное. – shikhanshu

+2

@shikhanshu Существует: 'caller'. См. Вопрос, который я связал по вашему вопросу. Но Tanktalus прав: вы должны работать, чтобы модулизовать свой код. – ThisSuitIsBlackNot

+1

@shikhanshu Это называется «рефакторинг» и значительно упростит вашу жизнь в среднесрочной и долгосрочной перспективе. И часто упрощал мою жизнь и в краткосрочной перспективе. – Tanktalus