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

时间:2011-06-10 04:38:24

标签: perl command-line flags

我见过很多运行Perl代码或脚本的方法,有不同的标志。但是,当我尝试google每个标志的含义时,我主要将结果发送到通用Perl网站,并且没有关于标志或其使用的具体信息。

以下是我经常遇到的旗帜,我不知道它们的含义:

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

如果你告诉我每个人的意思和一些用例,或者至少告诉我找出其含义的方法,我将非常感激。

4 个答案:

答案 0 :(得分:134)

是的,谷歌很难找到标点符号,不幸的是,Perl 似乎主要由标点符号组成: - )

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

逐个简要地进入选项:

-p: Places a printing loop around your command so that it acts on each
    line of standard input. Used mostly so Perl can beat the
    pants off awk in terms of power AND simplicity :-)
-n: Places a non-printing loop around your command.
-e: Allows you to provide the program as an argument rather
    than in a file. You don't want to have to create a script
    file for every little Perl one-liner.
-i: Modifies your input file in-place (making a backup of the
    original). Handy to modify files without the {copy,
    delete-original, rename} process.
-w: Activates some warnings. Any good Perl coder will use this.
-d: Runs under the Perl debugger. For debugging your Perl code,
    obviously.
-t: Treats certain "tainted" (dubious) code as warnings (proper
    taint mode will error on this dubious code). Used to beef
    up Perl security, especially when running code for other
    users, such as setuid scripts or web stuff.

答案 1 :(得分:10)

-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调试器

答案 2 :(得分: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

但请记住,&lt; ARGV&gt;使用2参数打开,因此没有以> <开头或以|开头/结尾的文件名。

答案 3 :(得分:4)

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

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

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

例如:

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

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