问题不是如何在一个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 ;
如果你有一个snazzier正则表达式,可以随意改进我的.
有几个人问我为什么要这样做. brian正确地猜测,我想根据是否是脚本来改变导出行为,我们可以假设它有一些设计,或者是一个用户在单个命令行中尝试尽可能多的oneliner.
这听起来很糟糕,因为出口商应该尊重其他软件包 – 有时被称为“@EXPORT is EVIL!”这样的信条.但是在我看来,在应用于线人的时候,这是一种愚蠢的一致性.毕竟perl本身就是出于违反其语言结构的方式,如果您在命令行中要求它们,就可以轻松地循环,我只想将这个想法扩展到我的操作/业务领域.我甚至想要应用源过滤器(喘气!),如果它有帮助.
但是这个问题也表明,我可能想成为一个很好的Perl公民,因为我只是在某些情况下打破社区准则.通过更改批处理调度程序中的命令行,而不是编写一个全新的模块,能够创建主要的业务级别操作是非常棒的.测试周期压缩很大.
解决方法
如果从-e运行,$0设置为“-e”.