Perl flags -pe, -pi, -p, -w, -d, -i, -t?

I have seen lots of ways of running Perl code or scripts, with different flags. However, when I try to google for what each flag means, I mainly get results to generic Perl sites and no specific information regarding the flags or their use is found there.

Below are the flags that I encounter most often, and I don't have a clue what they mean:

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

I will be very grateful if you tell me what each of those mean and some use cases for them, or at least tell me a way of finding out their meaning.

76720 次浏览

是的,Google 在查找标点符号方面是出了名的困难,不幸的是,Perl 是的似乎主要由标点符号组成: -)

Perlrun中详细介绍了所有命令行开关(可通过调用 perldoc perlrun从命令行获得)。简单介绍一下选项,一个一个来:

  • -p: 在命令周围放置一个打印循环,以便它对标准输入的每一行进行操作。大多数情况下,Perl 可以在功能和简单性方面击败 Awk: -)
  • -n: Places a non-printing loop around your command.
  • -e: 允许您以参数的形式而不是以文件的形式提供程序。您不希望为每个小 Perl 一行程序都创建一个脚本文件。
  • 就地修改输入文件(对原始文件进行备份)。无需 {copy, delete-original, rename}进程即可方便地修改文件。
  • -w: Activates some warnings. Any good Perl coder will use this.
  • -d: Runs under the Perl debugger. For debugging your Perl code, obviously.
  • -t: 将某些“受污染的”(可疑的)代码视为警告(适当的污染模式将在这个可疑的代码上出错)。用于加强 Perl 安全性,特别是在为其他用户运行代码时,如 setuid 脚本或 Web 内容。

-p标志基本上使用

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

-e允许您将脚本作为参数而不是作为文件传递:

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

-i指示解释器,执行脚本传递给 STDIN的所有数据都要在原处完成。

-wuse warnings;相同,但是在全局范围而不是局部范围内

-d运行 Perl 调试器

如果您使用 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 set $^ I,like

$ 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参数 open,所以不要使用以 > <开头或以 |开始/结束的文件名。

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

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

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

例如:

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

将打印出在“ Messages read:”之后找到的所有整数值,仅此而已。