判断Perl是否在-e上运行的最佳方法是什么?

时间:2020-03-06 15:04:45  来源:igfitidea点击:

问题不在于如何用一个单一的线来区分。如果我们以单行代码的形式编写代码,那么我们就知道自己是。但是-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
    ;

而且,如果我们有一个时髦的正则表达式,请随时进行改进。

几个人问我为什么要这样做。 brian正确地猜测到我想基于它是一个脚本(我们可以假设它已经进行了一些设计)还是它是一个用户试图在单个命令行中尽可能多地执行的单一代码来更改导出行为。

这听起来很糟糕,因为出口商有一种信条,即出口商应该尊重其他包裹-有时被称为"@ EXPORT是邪恶的!"但在我看来,将其应用于oneliners时,这是愚蠢的一致性。当所有perl本身都摆脱了它的语言结构,并且如果我们在命令行中要求它们时,给我们提供了简单的循环,我只是想将其扩展到我的运营/业务领域。如果有帮助,我什至希望应用源过滤器(gasp!)。

但是这个问题也暗示我可能也想成为Perl的好公民,因为我只是在某些情况下违反了社区准则。仅通过在批处理调度程序中更改命令行,而不是编写一个全新的模块,就能够创建主要的业务级操作,这真是太棒了。测试周期被大大压缩。

解决方案

如果从-e运行,则将$ 0设置为" -e"。

我们为什么要找出是否从命令行中包含了该模块?在某些情况下,我们有什么要紧的吗?我们对进口商品是否有些奇怪?告诉我们我们要做什么,我可能可以想出一种更好的方法:)

好的,我们正在询问有关导出的信息。我们要解决的问题是什么?我们想要哪种方式?从命令行额外或者更少的默认导出?我们是否知道可以使用-M指定导入列表,包括导出标签(因此,%EXPORT_TAGS中的内容)?而且,如果我们希望导出列表为空,则可以使用-m(小写的m)代替。请参阅perlrun中-M / -m的条目。

我们可能也对" modulino"技巧感兴趣,在该技巧中,模块文件既可以是模块又可以是脚本。我们可以将其用作常规模块(在这种情况下我们可以访问其所有方法),也可以将其作为脚本调用(在这种情况下它可以运行)。我在《 Perl Journal》的"脚本作为模块"一文以及Perlmonks的"脚本如何成为模块"一文中对此进行了描述。

在import()中,如果模块是通过-M加载的,则caller()返回的行号将为0。每当使用-M时(或者不使用-e)都是如此,但我认为这是唯一的行号为​​'0'的情况。

如果我们想要不同的导出行为,则使用不同的模块名称是"干净"的方法。如果我们真的希望使用很多单线,甚至可以给它起一个简短的名字。例如。 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 ...