【问题标题】:Perl flags -pe, -pi, -p, -w, -d, -i, -t?Perl 标志 -pe、-pi、-p、-w、-d、-i、-t?
【发布时间】:2011-09-12 05:18:55
【问题描述】:

我见过很多运行 Perl 代码或脚本的方法,使用不同的标志。但是,当我尝试用谷歌搜索每个标志的含义时,我主要会在通用 Perl 网站上获得结果,并且在那里找不到有关标志或其使用的具体信息。

以下是我最常遇到的标志,但我不知道它们的含义:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

如果您能告诉我它们各自的含义以及它们的一些用例,或者至少告诉我一种找出它们含义的方法,我将非常感激。

【问题讨论】:

  • 在谷歌上搜索有关 perl 的基本答案通常会将您带到一些非常无用的网站。总是先检查 perl 自己的文档。
  • 第二。在这种情况下,perldoc perlrun 有一个 Perl 接受的所有命令行选项的列表。
  • 谷歌问题:减号被谷歌解释为“排除这个词”。为避免这种行为,请将包含减号的术语放在引号中。

标签: perl command-line flags


【解决方案1】:

是的,众所周知,Google 很难查找标点符号,不幸的是,Perl 确实似乎主要由标点符号组成:-)

命令行开关在perlrun中都有详细说明。 (可通过调用perldoc perlrun从命令行获得)

一一简要介绍选项:

-p:在您的命令周围放置一个打印循环,以便它作用于每个 标准输入行。主要用于 Perl 可以击败 在功能和简单性方面让 awk 脱掉裤子 :-) -n:在您的命令周围放置一个非打印循环。 -e:允许您将程序作为参数提供,而不是 比在文件中。您不想创建脚本 每个小的 Perl 单行文件。 -i:就地修改您的输入文件(备份 原版的)。无需 {copy, 即可方便地修改文件, 删除原始,重命名} 过程。 -w:激活一些警告。任何优秀的 Perl 编码器都会使用它。 -d:在 Perl 调试器下运行。为了调试你的 Perl 代码, 明显地。 -t:将某些“受污染”(可疑)代码视为警告(正确 污点模式将在此可疑代码上出错)。习惯了牛肉 提高 Perl 安全性,尤其是在为其他人运行代码时 用户,例如 setuid 脚本或 Web 内容。

【讨论】:

  • 我没有注意到你提到了perldoc perlrun。我已经删除了我的答案。 :-)
  • 实际上,-w 通常应避免使用,因为它会为 所有 代码启用警告,包括在编写时未考虑警告的 CPAN 模块。结果通常很嘈杂,而且毫无用处。
  • -w 通常是避免使用的,但应在您自己的代码中将其替换为use warnings
  • @duskwuff:总的来说,我同意,我在自己的代码中使用use warnings,但是 -w 确实有用——它有助于清除编写不佳的 CPAN 模块。 :-)
  • @IanBytchek 可能/必须采用附加参数的参数不能在压缩列表中。 -i 为备份使用扩展名。 -e 接受 perl 命令。在-0ep 中,您告诉 perl 'p' 是 perl 命令而不是参数。这根本不会奏效。
【解决方案2】:

-p 标志基本上运行脚本

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e 允许您将脚本传递给STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-i 指示解释器执行脚本传递给STDIN 的所有数据都将就地完成。

-wuse warnings; 相同,但在全局而非本地范围内

-d 运行 Perl 调试器

【讨论】:

  • -wuse warnings不太一样,后者的作用域是本地文件
  • 加号,真实,修补答案。
  • 将脚本作为参数传递与在 STDIN 上传递脚本不同。 -i 从参数列表中获取文件名,而不是标准输入。虽然 STDIN 通常与控制终端相关联,并且是从读取 stdin 并将参数列表设置为 perl 的 shell 继承的,但它们并不是一回事。
【解决方案3】:

其他人提到过perlrun。如果您使用 B::Deparse,您可以了解它的含义(对于大多数情况):

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1 用 '???' 表示,因为它被优化掉了。

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-i 设置$^I,喜欢

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

但请记住, 使用 2 参数打开,因此文件名不能以 &gt; &lt; 开头或以 | 开头/结尾。

【讨论】:

    【解决方案4】:

    还有一个重要的标志-n 未在列表中提及。

    -n-p 的作用相同,只是它默认不打印$_。这在过滤文本文件时非常有用。

    通过这种方式,Perl 可以在单行中替换 grep | sed

    例如:

    perl -ne 'print "$1\n" if /Messages read: (\d+)/' &lt;my_input.txt

    将打印出在 "Messages read:" 之后找到的每个整数值,仅此而已。

    【讨论】:

    • 这可以进一步简化。不需要“打印”$1\n“”。您可以只使用“打印”。
    • 不,它不能,print $1print (print $_) 不同。
    • 它可以:echo abc | perl -nw -e "print if (1)" 将打印abc。不需要$1 参考。
    • @devouredelysium:是的,但不想打印整行,只打印正则表达式匹配的数字。
    猜你喜欢
    • 2021-08-23
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多