如何在使用“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块来实现这一点(并且可能甚至同意从某些观点来看,做“和”可能更好。
我感兴趣的是是否存在不同的解决方案。
答案 0 :(得分:6)
在没有仪式的情况下写下BEGIN
和END
块:
$ 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。