了解带有 -p、-i 和 -e 开关的 Perl 单行代码

pOr*_*inG -1 perl

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

\n\n

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

\n\n
perl -p -i -e 's/\xc3\xbf//g' filename\n
Run Code Online (Sandbox Code Playgroud)\n\n

请帮助理解工作流程。

\n

Dav*_*idO 5

    \n
  • -p暗示在引号中的代码周围存在与此类似的循环:while(<>){ ..... } continue{print}

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

  • \n
  • -e意味着评估后面的字符串作为代码并执行它。由于您使用的是-p,因此代码字符串将在隐式 while 循环中执行,如上所述。

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

  • \n
\n\n

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

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

如果你把所有这些放在一起,那一个班轮的作用与此非常接近:

\n\n
BEGIN { $^I = ""; }                   # Set in-place edit mode.\nour $oldargv = \'\';                    # Placeholder or sentinel flag.\nwhile (defined($_ = readline ARGV)) { # ARGV will be the currently\n                                      # opened file from commandline.\n    if ($ARGV ne $oldargv) {\n        open ARGVOUT, \'>$ARGV\';       # Open an output file; same name\n                                      # as input file, but ARGV still\n                                      # reads from original.\n        select ARGVOUT;               # Output goes to ARGVOUT.\n        $oldargv = $ARGV;             # Keep track of what filename we\n                                      # are reading from.\n    }\n\n    $_ =~ s/\xc3\xbf//g;                     # Do our work... substitute.\n\n}\ncontinue {\n    print $_;                         # After each iteration print the\n                                      # content of $_ to ARGVOUT.\n}\nEND {\n    select STDOUT;\n    close ARGVOUT;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n