问题不在于如何在oneliner中辨别,如果你用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
is EVIL!”,但在我看来,这种一致性在应用于oneliner时是愚蠢的。毕竟,perl本身会违反其语言结构,如果您在命令行中请求循环,它会给您提供简单的循环。我只是想把这个想法扩展到我的操作/业务领域。如果有帮助的话,我甚至想应用源代码过滤器(* 喘气!*)。
但是这个问题也暗示了我可能也想成为一个Perl的好公民,因为我只想在某些情况下打破社区的指导方针。能够仅仅通过改变批处理调度程序中的命令行而不是编写一个全新的模块来创建主要的业务级操作是相当令人敬畏的。测试周期被大大压缩了。
4条答案
按热度按时间qyuhtwio1#
如果从
-e
运行,则$0
设置为"-e"
。w3nuxt5m2#
为什么你要尝试从命令行中找出模块是否包含在其中?是否有什么情况需要你注意?你是否在导入时做了一些奇怪的事情?告诉我们你想做什么,我可能会想出一个更好的方法来做:)
好吧,你问的是导出。你想解决什么问题?你想用哪种方式?从命令行导出更多或更少的默认值?你知道你可以用
-M
指定一个导入列表,包括一个导出标签吗如果你想要一个空的导出列表,你可以使用-m
(小写m),参见perlrun中的-M
/-m
条目。您可能还对“modulino”技巧感兴趣,其中模块文件可以既是模块又是脚本。您可以将它用作常规模块,在这种情况下您可以访问它的所有方法,或者将它作为脚本调用,在这种情况下它将运行。我在关于
The Perl Journal
以及Perlmonks上的"How a Script Becomes a Module"的"Scripts as Modules"文章中描述了它。hfsqlsce3#
在你的
import()
中,如果你的模块是通过-M
加载的,那么caller()
返回的行号将是0
。这在 * -M被使用时是真的(不管有没有-e),但是我认为只有在行号是0
的情况下才是真的。rqenqsqc4#
如果你想要不同的导出行为,“干净”的方法就是使用不同的模块名,如果你真的希望用一行程序,你甚至可以给予它一个简短的名字,例如MMN.pm:
注意Exporter有一个鲜为人知的正则表达式特性;你可能只想