阅读(364) (0)

命令行选项

2016-02-24 16:03:17 更新

Shebang 行

几乎每个 Perl 程序都如此开始:

#!/usr/bin/perl

这是 UNIX 结构,它告诉 Shell 直接执行余下的输入程序文件。

你可以在此行添加 Perl 的任何命令行选项,它们将成为选项之后命令行的一部分。 如果你有一个程序包含:

#!/usr/bin/perl -T

然后执行:

perl -l program.pl

-l 和 -T 两个选项都会使用,但 -l 将先用。在 perlrun 文档中介绍 了 Perl 的命令行选项。此处只介绍最有用的内容。

perl -T

Perl 允许你在 taint 模式执行。在此模式中,变量在使用前需要“消毒”,以 应对不安全的操作。

何为不安全?

  • 执行程序
  • 写入文件
  • 创建目录
  • 基本上,修改系统的任何事情

如果你没有“去污”数据,那么这些操作将是程序中的严重错误。

如何去污?使用正则表达式匹配有效的值,然后将匹配赋给变量。

my ($ok_filename) = $filename =~ /^(\w+\.log)$/;

你应当达到程序 taint 安全的目的。

perl -c file.{pl,pm}

此命令行选项允许检查给定文件的语法错误。它也会执行 BEGIN 块中的任意 代码,并检查程序中已使用的模块。

你应当使用 -c 在每次更改后检查代码的语法。

perl -e 'code'

该选项允许你从命令行执行代码,以代替将程序写入文件来执行。

$ perl -e 'print "1\n"'
1

这对小程序、快速计算、以及与其他选项组合使用非常有用。

-n、-p、-i

Perl 的 -n 选项允许你针对标准输入的每行重复执行代码(通常使用 -e 指定)。 这些是等效的:

$ cat /etc/passwd | perl -e 'while (<>) { if (/^(\w+):/) { print "$1\n"; } }'
root
...
$ cat /etc/passwd | perl -n -e 'if (/^(\w+):/) { print "$1\n" }'
root
...

-p 选项与 -n 相同,除了它在每行后打印 $_

如果你组合 -i 选项,Perl 将就地编辑你的文件。因此,要将一堆文件从 DOS 转换成 UNIX 换行,你可以这样干:

$ perl -p -i -e 's/\r\n/\n/' file1 file2 file3

perl -M

Perl 的 -M 选项使你可以从命令行使用模块。有好些模块首选此方式运行(如 _CPAN_和 Devel::Cover)。如果你需要使用 -e 包含模块,它也是习惯的 简写。

$ perl -e 'use Data::Dumper; print Dumper( 1 );'
$VAR1 = 1;

$ perl -MData::Dumper -e 'print Dumper( 1 );'
$VAR1 = 1;

明白模块是否已被安装

试试从命令行加载模块。-e1 只是一个立即退出的空程序。如果你获得错误, 那么该模块未被安装:

$ perl -MWWW::Mechanize::JavaScript -e 1
Can't locate WWW/Mechanize/JavaScript.pm in @INC...
BEGIN failed--compilation aborted.
$

返回没有错误则意味着该模块已安装。

$ perl -MWWW::Mechanize -e 1
$

当它存在时,检查版本:

$ perl -MWWW::Mechanize -e'print $WWW::Mechanize::VERSION'

并非所有模块都有 $VERSION 变量,因此这可能不总是工作。