问题不在于如何告诉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
EVIL !”但在我看来,当应用于oneliner时,这是一种愚蠢的一致性。毕竟Perl本身就是违反其语言结构的方式,并且如果你在命令行上询问它们就会给你简单的循环,我只想将这个想法扩展到我的运营/业务领域。如果它有帮助,我甚至想要应用源过滤器( gasp!)。
但是这个问题也表明我可能也想成为Perl的好公民,因为我只是在某些情况下打破社区准则。能够通过更改批处理调度程序中的命令行而不是编写一个全新的模块来创建主要的业务级操作是非常棒的。测试周期大大压缩。
答案 0 :(得分:34)
$0
开始运行,则 "-e"
设置为-e
。
答案 1 :(得分:10)
为什么要尝试查看模块是否包含在命令行中?你有什么重要的情况吗?你在做进口的奇怪事吗?告诉我们你要做什么,我可以想出一个更好的方法:)
好的,你问的是出口问题。你试图解决的问题是什么?你想要哪种方式?命令行中是否有额外或更少的默认导出?您是否知道可以使用-M指定导入列表,包括导出标记(因此,来自%EXPORT_TAGS的内容)?如果你想要一个空的导出列表,你可以使用-m(小写m)代替。请参阅perlrun中的-M / -m条目。
您可能也对“modulino”技巧感兴趣,其中模块文件既可以是模块也可以是脚本。您可以将它用作常规模块,在这种情况下,您可以访问其所有方法,或将其称为脚本,在这种情况下它将运行。我在我的"Scripts as Modules"文章中描述了 The Perl Journal 以及关于Perlmonks的"How a Script Becomes a Module"。
答案 2 :(得分:1)
在import()
中,如果您的模块是通过caller()
加载的,0
返回的行号将为-M
。这是真的每当使用 -M(使用-e或不使用)时,我认为这是唯一一个行号为0
的情况。
答案 3 :(得分:1)
如果你想要不同的导出行为,那么“干净”的方法就是使用不同的模块名称。如果你真的希望进行大量的单行使用,你甚至可以给它一个简短的名字。例如。 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 ...