Какой лучший способ узнать, работает ли ваш Perl на -e?

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

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

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

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


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

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

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

Ответ 1

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

Ответ 2

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


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

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

Ответ 3

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

Ответ 4

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

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

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

perl -MMy::Module::Name=/./ -e ...