## 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` 变量,因此这可能不总是工作。