Как лучше всего определить, работает ли ваш Perl на -e? - PullRequest
13 голосов
/ 03 октября 2008

Вопрос не в том, как сказать в oneliner. Если вы пишете код в одну строку, вы знаете, вы. Но как модуль, включенный -MMy::Module::Name, знает, что все началось с одного пользователя.

Это мое. Хотя он непереносим и использует стандартные команды UNIX (хотя его можно сделать более или менее переносимым).

my $process_info = `ps $$ | tail -1`;
my $is_oneliner  
    = $process_info =~ m/perl.*?\s+-[^\P{IsLower}e]*e[^\P{IsLower}e]*\s+/m
    ;

И если у вас есть удивительное регулярное выражение, не стесняйтесь улучшать мое.


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

Это звучит плохо, потому что существует такое кредо, что экспортеры должны уважать другие пакеты - иногда известные как "@EXPORT is EVIL !" Но мне кажется, что это глупая последовательность применительно к oneliners. После того, как весь perl выходит из-под контроля, нарушает структуру своего языка и дает вам простые циклы, если вы запрашиваете их в командной строке, я просто хочу расширить эту идею для моей операционной / бизнес-сферы. Я даже хочу применить исходные фильтры ( вздох! ), если это поможет.

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

Ответы [ 4 ]

34 голосов
/ 03 октября 2008

$0 установлен на "-e", если вы работаете с -e.

10 голосов
/ 03 октября 2008

Почему вы пытаетесь узнать, был ли модуль включен из командной строки? Есть ли у вас ситуация, где это имеет значение? Вы делаете что-то странное с импортом? Скажите нам, что вы пытаетесь сделать, и я, вероятно, смогу придумать лучший способ сделать это:)


Хорошо, вы спрашиваете об экспорте. Какую проблему вы пытаетесь решить? Какой путь ты хочешь? Дополнительный или меньший экспорт по умолчанию из командной строки? Знаете ли вы, что вы можете указать список импорта с -M, включая тег экспорта (то есть что-то из% EXPORT_TAGS)? И если вам нужен пустой список экспорта, вы можете использовать -m (строчная m). См. Запись для -M / -m в perlrun .

Вас также может заинтересовать трюк "modulino", где файл модуля может быть как модулем, так и скриптом. Вы можете использовать его как обычный модуль, в этом случае у вас есть доступ ко всем его методам, или вызвать его как скрипт, и в этом случае он запускается. Я описываю это в своей статье «Сценарии как модули» для The Perl Journal , а также «Как скрипт становится модулем» в Perlmonks.

1 голос
/ 05 октября 2008

Если вам нужно другое поведение экспорта, «чистый» способ сделать это - использовать другое имя модуля. Если вы действительно рассчитываете на использование одной строки, вы можете даже дать ей короткое имя. Например. MMN.pm:

package MMN;
use My::Module::Name '/./';
use Exporter ();
@ISA = 'Exporter';
@EXPORT = @My::Module::Name::EXPORT_OK;
1;

Обратите внимание, что Exporter имеет малоизвестную функцию регулярных выражений; Вы можете просто хотеть сделать

perl -MMy::Module::Name=/./ -e ...
1 голос
/ 04 октября 2008

В вашем import() номер строки, возвращаемый caller(), будет 0, если ваш модуль был загружен через -M. Это верно всякий раз, когда используется -M (с -e или нет), но я думаю, что это единственный случай, когда номер строки равен 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...