代码之家  ›  专栏  ›  技术社区  ›  DVK

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

  •  2
  • DVK  · 技术社区  · 14 年前

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

    详细解释:

    比如,我有以下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'
    

    但是,我们如何插入 设置代码 在这里?

    我唯一的想法是尝试在循环后通过 BEGIN{} 阿拉巴马州布洛克

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

    但这似乎有点老土。

    还有其他解决办法吗?

    只是说清楚-我 已经知道了 我可以通过拼写出 虽然 循环而不是使用“-n”或使用begin/end块(甚至可能同意从某些角度来看,“while”可能更好)。

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

    6 回复  |  直到 9 年前
        1
  •  4
  •   mob    14 年前

    把你的额外代码偷偷输入 -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
  •  6
  •   Greg Bacon    14 年前

    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
        3
  •  2
  •   tchrist    14 年前

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

    你甚至可以通过 $ENV{PERL5OPT} 尽管开关相当有限;不 ‑e ‑E 例如。

    我想你可以做些无耻的事 $ENV{PERL_ENCODING} 如果你真的想的话。

    这就是全部 Acme:: 领土。 拜托 不。

    编辑: 这个 只有 我最喜欢的解决方案是非常不具创造性和完全直截了当的 INIT{} .

        4
  •  1
  •   aschepler    14 年前

    删除-n并添加 while (<>) { } . 什么?它比 BEGIN 事情。

        5
  •  1
  •   Peter Mortensen icecrime    9 年前

    也许有一些模糊的方法来实现这一点 -ne 但是,是的,仅仅使用它就容易多了 perl -e 和代码 while(<>) 你自己。

        6
  •  -1
  •   harleypig    14 年前

    在命令行上可以有多个-e开关。

    假设测试包含

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

    将打印30。