问题不在于如何告诉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 ;
如果你有一个时髦的正则表达式,请随意改进我的.
有几个人问我为什么要这样做.brian正确地猜到我想改变导出行为是基于它是否是一个脚本,我们可以假设它已经有了一些设计,或者它是否是用户在单个命令行中尽可能多地尝试做的oneliner.
这听起来很糟糕,因为有这样的信条,出口企业应该尊重其他包-有时被称为" @EXPORT
是邪恶的!" 但在我看来,应用于oneliner时这是一种愚蠢的一致性.毕竟Perl本身就是违反其语言结构的方式,并且如果你在命令行上询问它们就会给你简单的循环,我只想将这个想法扩展到我的运营/业务领域.如果它有帮助我甚至想要应用源过滤器(喘息!).
但是这个问题也表明我可能也希望成为Perl的好公民,因为我只是在某些情况下打破社区准则.能够通过更改批处理调度程序中的命令行而不是编写一个全新的模块来创建主要的业务级操作是非常棒的.测试周期大大压缩.
$0
"-e"
如果您正在运行,则设置为-e
.
你为什么试图找出模块是否包含在命令行中?你有什么重要的情况吗?你在做进口的奇怪事吗?告诉我们你要做什么,我可能想出一个更好的方法来做:)
好的,你问的是出口问题.你试图解决的问题是什么?你想要哪种方式?命令行中是否有额外或更少的默认导出?您是否知道可以使用-M指定导入列表,包括导出标记(因此,来自%EXPORT_TAGS的内容)?如果你想要一个空的导出列表,你可以使用-m(小写m)代替.请参阅perlrun中的 -M/-m 条目.
您可能还对"modulino"技巧感兴趣,其中模块文件既可以是模块也可以是脚本.您可以将它用作常规模块,在这种情况下,您可以访问其所有方法,或将其称为脚本,在这种情况下它将运行.我在Perl Journal的"Scripts as Modules"一文中以及Perlmonks上的"如何成为一个模块"中描述它.