Perl标志-pe,-pi,-p,-w,-d,-i,-t?


107

我已经看到了许多运行带有不同标志的Perl代码或脚本的方法。但是,当我尝试用Google搜索每个标志的含义时,我主要是在通用Perl网站上获得结果,并且在那里找不到有关标志或标志的使用的特定信息。

以下是我最常遇到的标志,我不清楚它们的含义:

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

如果您能告诉我这些含义以及它们的用例,或者至少告诉我一种了解其含义的方法,我将不胜感激。


21
搜寻有关perl的基本答案通常会导致您进入一些真正无用的站点。请始终先检查perl自己的文档。
2011年


2
第二。在这种情况下,perldoc perlrun列出Perl接受的所有命令行选项。
Sherm Pendley

1
Google问题:减号被Google解释为“排除此术语”。为避免这种情况,请将包含减号的术语放在引号中。
罗杰·克鲁格

Answers:


147

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

命令行开关在perlrun中都有详细说明。(可通过在命令行中致电来获得perldoc perlrun

简要地一步一步地进入选项:

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

1
我没有注意到您所提到的perldoc perlrun。我已删除答案。:-)
Alan Haggai Alavi

4
-w实际上,通常应避免使用它,因为它对所有代码启用了警告,包括未考虑警告编写的CPAN模块。结果通常非常嘈杂,而且毫无用处。
duskwuff -inactive- 2011年

9
-w通常避免使用,但应use warnings在您自己的代码中将其替换。
plusplus 2011年

6
@duskwuff:总的来说,我同意,并且我use warnings用自己的代码进行操作,但是-w确实有用处-它有助于清除编写不佳的CPAN模块。:-)
Sherm Pendley

2
@IanBytchek可能/必须采用其他参数的参数不能在压缩列表内。 -i扩展备份。 -e需要一个perl命令。在-0ep 您告诉perl时,“ p”是perl命令而不是参数。那根本行不通。
tjd

10

-p标志基本上使用以下命令运行脚本

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

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

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

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

-w与相同use warnings;,但在全球范围而非本地范围内

-d 运行Perl调试器


2
-w与不太相同use warnings,后者的作用域为本地文件
plusplus 2011年

plusplus,真实的,修补性的答案。
zellio 2011年

2
将脚本作为参数传递与在STDIN上传递脚本不同。-i从参数列表而不是stdin中获取文件名。尽管STDIN通常与控制终端相关联,并且从读取stdin并将参数列表设置为perl的外壳程序继承而来,但它们不是同一回事。
William Pursell 2011年

8

其他人提到了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

但是请记住,<ARGV>使用2参数打开,因此不要使用以> <开头或结尾的文件名|


4

-n列表中也没有提到一个重要的标志。

-n与的工作方式相同-p,只是$_默认情况下不打印。这在过滤文本文件时非常有用。

这样,Perl可以替换grep | sed为一个单线。

例如:

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

将打印出在“消息读取:”之后找到的每个整数值,仅此而已。


这可以进一步简化。不需要“ print” $ 1 \ n“”。您可以只使用“打印”。
吞噬了极乐世界,

不,print $1它不能与printprint $_)不同。
rustyx

它可以: echo abc | perl -nw -e "print if (1)"将打印abc。无需$1参考。
吞噬了极乐世界,

@devouredelysium:是的,但不想打印整行,而只希望打印正则表达式匹配的数字。
Ingo Blechschmidt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.