使用-p,-i和-e开关了解Perl one-liner

时间:2017-09-21 15:33:19

标签: perl

有一个perl脚本已经存在于其中一个模块中,我想了解/知道它的工作方式和参数的含义是如何传递的。

我试图找到在线传递的参数的描述,但我找不到任何解释它的好资源。

perl -p -i -e 's/ÿ//g' filename

请帮助理解工作流程。

1 个答案:

答案 0 :(得分:4)

  • -p意味着围绕引号中的代码使用与此类似的循环:while(<>){ ..... } continue{print}

  • -i表示“就地编辑”,这意味着您更改的每条逻辑记录(通常是一行)都会导致文件中该行的更改。

  • -e表示将后面的字符串计算为代码并执行它。由于您使用的是-p,因此代码字符串在隐式while循环中执行,如上所述。

  • s///是替换运算符。它作用于$_的内容,除非它使用=~绑定到其他标量。隐式“while”循环使用每次迭代的输入文件中的一条记录填充$_(在这种情况下,每次迭代输入文件中有一行)。因此,在每一行中,每次出现在行中时,您都会用ÿ字符替换空字符串(换句话说,删除该字符)。

您应该使用perldoc来探索Perl关于以下主题的内置文档:

  • perldoc perlintro - Perl简介。
  • perldoc perlretut - 关于Perl正则表达式的教程。
  • perldoc perlre - 对Perl正则表达式的更深入描述。
  • perldoc perlrun - 解释Perl的命令行开关,例如-p-e等。
  • perldoc perlop - 对Perl运算符的解释,包括<>s///
  • perldoc -f print - 说明Perl print函数的工作原理(-p暗示)。
  • perldoc -f defined
  • perldoc -f readline
  • perldoc perlsyn - Perl语法的说明,包括while(){}循环(-p表示while循环)。

如果你把所有这些放在一起,那一个班轮做了一件非常接近的事情:

BEGIN { $^I = ""; }                   # Set in-place edit mode.
our $oldargv = '';                    # Placeholder or sentinel flag.
while (defined($_ = readline ARGV)) { # ARGV will be the currently
                                      # opened file from commandline.
    if ($ARGV ne $oldargv) {
        open ARGVOUT, '>$ARGV';       # Open an output file; same name
                                      # as input file, but ARGV still
                                      # reads from original.
        select ARGVOUT;               # Output goes to ARGVOUT.
        $oldargv = $ARGV;             # Keep track of what filename we
                                      # are reading from.
    }

    $_ =~ s/ÿ//g;                     # Do our work... substitute.

}
continue {
    print $_;                         # After each iteration print the
                                      # content of $_ to ARGVOUT.
}
END {
    select STDOUT;
    close ARGVOUT;
}

这是使用Perl模块B :: Deparse拼凑在一起的近似表示,以及对Perl文档的深入研究。 Perl的文档非常广泛,可以在任何标准安装Perl的系统上使用。您可以通过在命令行输入来阅读Perl的文档:perldoc perl####其中####表示文档名称。示例:perldoc perldata。如果您想查找特定的Perl函数,可以使用-f开关,如perldoc -f open中所示。如果您想阅读Perl模块上的文档,您可以输入perldoc ModuleName(例如perldoc Scalar::Util)。