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

如何在perl脚本中使用“perl-pne”功能

  •  1
  • polygenelubricants  · 技术社区  · 14 年前

    因此,在命令行中,我可以方便地执行以下操作:

    perl -pne 's/from/to/' in > out
    

    perl -pne 我可以把它们放在 .bat Windows中的文件。当然,这是一种相当迂回的做法。我应该写一个 perl 包含所有正则表达式转换的脚本。

    那你怎么写呢?如果我有一个包含以下行的shell脚本:

    perl -pne 's/from1/to1/' in > temp
    perl -pne 's/from2/to2/' -i temp
    perl -pne 's/from3/to3/' -i temp
    perl -pne 's/from4/to4/' -i temp
    perl -pne 's/from5/to5/' temp > out
    

    perl语言 脚本?

    2 回复  |  直到 14 年前
        1
  •  10
  •   daxim e.dan    14 年前

    -e 接受任意复杂程序。所以只要加入你的替换操作。

    perl -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/' in > out
    

    如果您真的想要一个能显式地处理输入和循环的Perl程序,那么可以将一行代码拆开以查看生成的代码并从这里开始工作。

    > perl -MO=Deparse -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/'
    LINE: while (defined($_ = <ARGV>)) {
        s/from1/to1/;
        s/from2/to2/;
        s/from3/to3/;
        s/from4/to4/;
        s/from5/to5/;
    }
    continue {
        print $_;
    }
    -e syntax OK
    
        2
  •  6
  •   hobbs    14 年前

    你没有回答的问题的相关答案 相当地 perl special variable $^I ,与一起使用 @ARGV ,提供了的就地编辑行为 -i . 与-p选项一样,Deparse将显示生成的代码:

    perl -MO=Deparse -pi.bak -le 's/foo/bar/'
    BEGIN { $^I = ".bak"; }
    BEGIN { $/ = "\n"; $\ = "\n"; }
    LINE: while (defined($_ = <ARGV>)) {
        chomp $_;
        s/foo/bar/;
    }
    continue {
        print $_;
    }