## 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`?變量,因此這可能不總是工作。