使用“perl -ne”时如何指定“before-the loop”代码?

时间:2010-11-11 22:38:50

标签: perl command-line

如何在使用“perl -ne”时指定“before-the loop”代码,而不使用BEGIN / END块或用实际拼写出的while循环替换“-n”?

详细解释:

说,我有以下Perl代码:

use MyModule;
SETUP_CODE;
while (<>) {
    LOOP_CODE;
}
FINAL_CODE;

如何使用perl -ne

替换单线程

当然,循环部分由-n本身处理,而FINAL_CODE可以使用最后添加“} { FINAL_CODE”的技巧来完成;而use语句可以通过“-M”参数处理。

所以,如果我们在循环之前没有SETUP_CODE,我可以写下以下内容:

perl -MMyModule -ne 'LOOP_CODE } { FINAL_CODE'

但是,我们如何在此处插入SETUP_CODE

我唯一的想法是尝试在循环后通过BEGIN{}块添加它,ala

perl -MMyModule -ne 'LOOP_CODE } BEGIN { SETUP_CODE } { FINAL_CODE'

但这似乎充其量只是hacky。

任何其他解决方案?

要清楚 - 我已经知道我可以通过拼写while循环而不是使用“-n”或使用BEGIN / END块来实现这一点(并且可能甚至同意从某些观点来看,做“和”可能更好。

我感兴趣的是是否存在不同的解决方案。

6 个答案:

答案 0 :(得分:6)

在没有仪式的情况下写下BEGINEND块:

$ perl -lne 'BEGIN { print "hi" }
             print if /gbacon/;
             END { print "bye" }' /etc/passwd
hi
gbacon:x:700:700:Greg Bacon,,,:/home/gbacon:/bin/bash
bye

答案 1 :(得分:4)

将您的额外代码隐藏到-M选项

perl -M'Module;SETUP CODE' -ne 'LOOP CODE'

$ perl -MO=Deparse -M'MyModule;$SETUP=1' -ne '$LOOP=1}{$FINAL=1'
use MyModule;
$SETUP = 1;
LINE: while (defined($_ = <ARGV>)) {
    $LOOP = 1;
}
{
    $FINAL = 1;
}
-e syntax OK

答案 2 :(得分:2)

将额外的代码放入模块中并使用‑M。那将在循环之前运行。

你甚至可以通过$ENV{PERL5OPT}潜入某些东西,虽然开关非常有限;例如,没有‑e‑E

如果你真的想要的话,我想你也可以用$ENV{PERL_ENCODING}做一些离谱的事。

这是所有Acme::领域。 不要。 ☹

编辑:我非常喜欢的唯一的解决方案是非常简单且完全直截了当的INIT{}

答案 3 :(得分:1)

删除-n并添加while (<>) { ... }。 什么?它比BEGIN更简单,更直接。

答案 4 :(得分:1)

也许有一些模糊的方法可以通过-ne来实现这一目标,但是,只需在perl -e中使用while(<>)代码就更容易了。

答案 5 :(得分:-1)

您可以在命令行上使用多个-e开关。

假设测试包含

1
2
3
4

perl -e '$a=5;' -ne '$b+=$_ + $a}{print "$b\n"' test

将打印30。