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

DVK*_*DVK 2 perl command-line

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

详细解释:

说,我有以下Perl代码:

use MyModule;
SETUP_CODE;
while (<>) {
    LOOP_CODE;
}
FINAL_CODE;
Run Code Online (Sandbox Code Playgroud)

如何使用单线代替perl -ne

当然,循环部分由它-n自己处理,而FINAL_CODE可以使用} { FINAL_CODE最后添加" " 的技巧来完成; 而use声明可以通过" -M"参数处理.

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

perl -MMyModule -ne 'LOOP_CODE } { FINAL_CODE'
Run Code Online (Sandbox Code Playgroud)

但是,我们怎么能插入SETUP_CODE这里?

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

perl -MMyModule -ne 'LOOP_CODE } BEGIN { SETUP_CODE } { FINAL_CODE'
Run Code Online (Sandbox Code Playgroud)

但这似乎充其量只是hacky.

还有其他方法吗?

只是要清楚 - 我已经知道我可以通过拼写while循环而不是使用"-n"或使用BEGIN/END块来做到这一点(甚至可能同意从某些观点来看,做"while"可能更好).

我感兴趣的是是否有不同的解决方案.

Gre*_*con 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

  • 除了BEGIN之外的任何*其他*都是hacky到完全愚蠢的程度. (4认同)
  • @DVK:然后使用`INIT {}`块.我可以'Acme ::`它? (2认同)